[英]what are the differences between __strong and strong, __weak and weak?
[英]what is the difference between strong and weak property?
由于iOS 5中的强弱属性是新的。如果有人告诉我何时使用了哪个属性。
什么时候应该使用强者还是应该使用弱者?
@property(nonatomic,strong)
@property(nonatomic,weak)
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);
}
Strong
意味着只要此属性指向一个对象,该对象就不会自动释放。 在非ARC中,它是retain
的同义词。
相反, Weak
意味着属性指向的对象可以自由释放,但前提是它将属性设置为nil
。 在ARC中,您使用weak来确保您不拥有它指向的对象。
查看Apple文档以获取自动参考计数(ARC)
如果您没有时间阅读它:
ARC为对象和弱引用引入了几个新的生命周期限定符。 弱引用不会延长它指向的对象的生命周期,并且在没有对该对象的强引用时自动变为nil。
强是默认的。 只要存在指向它的强指针,对象就会保持“活着”。
weak指定不保持引用对象存活的引用。 当没有对象的强引用时,弱引用设置为nil。
由于iOS 5 ARC自动使弱链接无效,因此在卸载对象时,其对象层次结构将自动设置为nil。 由于这个原因, Weak
是所有outlet
属性的推荐关系。 这些视图对象已经是视图控制器视图层次结构的一部分,不需要在其他地方保留。 声明你的网点很弱的一大优点是它可以节省你编写viewDidUnload方法的时间。
查看一个非常详细的文档,参考内存管理 。 它是ARC之前的版本,但它可以帮助您理解内存管理。 属性的retain关键字仍然适用于ARC,只是strong的同义词。 或者另一个特定的ARC教程 。
强弱之间存在以下差异。
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而其他弱者为ex-我们可以看到UIButton,UILabel out let等
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.