iOS 5中的强弱属性是新的。 如果有人告诉我何时使用了哪个属性。
什么时候我们应该使用强者还是应该使用弱者?
@property(nonatomic,strong)
@property(nonatomic,weak)
答案 0 :(得分:2)
strong
与retain
类似,weak
与assign
类似。主要区别在于weak
属性在分配给它们的对象被释放时变为nil
。
例如:
@property (nonatomic, weak) id test;
...
- (void)example
{
id foo = [[NSObject alloc] init];
self.test = foo;
foo = [[NSObject alloc] init];
assert(self.test == nil);
}
答案 1 :(得分:2)
Strong
表示只要此属性指向一个对象,该对象就不会自动释放。在非ARC中,它是retain
的同义词。
Weak
表示属性指向的对象可以自由释放,但前提是它将属性设置为nil
。在ARC中,您使用weak来确保您不拥有它指向的对象。
答案 2 :(得分:2)
查看Automatic Reference Counting (ARC)
的Apple文档如果您没有时间阅读它:
ARC为对象和弱引用引入了几个新的生命周期限定符。弱引用不会延长它指向的对象的生命周期,并且在没有对该对象的强引用时自动变为nil。
强是默认值。只要存在指向它的强指针,对象就会保持“活着”。
弱指定不使引用对象保持活动状态的引用。当没有强弱时,弱引用设置为nil 对象的引用。
由于iOS 5 ARC自动使弱链接无效,因此在卸载对象时,其对象层次结构将自动设置为nil。由于这个原因,Weak
是所有outlet
属性的推荐关系。这些视图对象已经是视图控制器视图层次结构的一部分,不需要在其他地方保留。声明你的网点薄弱的一大优势是它可以节省你编写viewDidUnload方法的时间。
查看引用memory management的非常详细的文件。它是ARC之前的版本,但它可以帮助您理解内存管理。属性的retain关键字仍然适用于ARC,只是strong的同义词。或另一个特定的ARC tutorial。
答案 3 :(得分:0)
强弱之间存在以下差异。
1.如果我们声明变量强,那么它不会被编译器解除分配,直到内存中的Application实例。当我们将nil值设置为该引用时,它会被编译器解除分配,默认情况下任何局部变量都是强变量。 例如:- var str =" hello world"
如果我们设置str = nil则将其解除分配。
2.如果我们将变量声明为强,那么它将被其他实例(Class)保留,并且它会将计数增量保留为1.
财产薄弱。
1.当我们声明弱属性时,它只包含数据/实例地址,直到强引用在内存中,如果强大的变量引用被释放它自动设置为nil。
对于前: - var str =" hello world" weak var stringVar = str
假设str包含200个堆地址,我们设置str = nil,然后由编译器自动将弱属性引用设置为nil。
这就是stoary board ref controller的原因,主视图只设置为strong而其他设备都很弱 - 我们可以看到UIButton,UILabel out e.t.c。