在iOS 5中,强引用和弱引用是新的概念。如果有人告诉我应该使用哪个属性,那么我们应该何时使用强引用或者弱引用呢?
@property(nonatomic,strong)
@property(nonatomic,weak)
在iOS 5中,强引用和弱引用是新的概念。如果有人告诉我应该使用哪个属性,那么我们应该何时使用强引用或者弱引用呢?
@property(nonatomic,strong)
@property(nonatomic,weak)
查看苹果文档,了解自动引用计数(ARC)。
如果您没有时间阅读:
ARC为对象引入了几个新的生命周期限定符和弱引用。弱引用不会延长其指向的对象的生命周期,并在没有强引用指向该对象时自动变为nil。
strong是默认值。只要有一个强指针指向对象,对象就会保持“活动状态”。
weak指定不会使所引用的对象保持存活的引用。当没有强引用指向该对象时,弱引用将设置为nil。
iOS 5 ARC在自动将弱链接置空时,当卸载对象时其对象层次结构会自动设置为nil。因此,对于所有outlet
属性,建议使用Weak
关系。这些视图对象已经是视图控制器的视图层次结构的一部分,不需要在其他地方保留。声明您的插座弱点的最大优势是节省编写viewDidUnload
方法的时间。
查看一份非常详细的文档,参考内存管理。这是在ARC之前的,但它会帮助你理解内存管理。属性的retain关键字仍然适用于ARC,并且只是strong的同义词。或者参考另一个具体的ARC教程。
Strong
意味着只要这个属性指向一个对象,那么该对象就不会被自动释放。在非ARC中,它是retain
的同义词。
Weak
则意味着该属性所指向的对象可以被释放,但只有当它将该属性设置为nil
时才能释放。在ARC中,您使用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);
}
强引用和弱引用有以下区别:
1.如果我们将变量声明为强引用,则编译器不会释放该变量,直到应用程序实例在内存中。当我们将nil值设置给该引用时,它将被编译器释放。默认情况下,任何局部变量都是强引用变量。
例如:
var str = "hello world"
2.如果我们将变量声明为强引用,则其他实例(类)将保留它,并且其保留计数将增加1。
弱引用属性。
1.当我们声明弱引用属性时,它仅包含数据/实例地址,直到强引用存在于内存中。如果强引用变量引用被释放,则它会自动设置为nil。
例如: var str = "hello world" weak var stringVar = str 假设str包含200个堆地址,我们将str = nil,则编译器会自动将弱引用属性引用设置为nil。
因此,在故事板引用控制器中,主视图只设置为强引用,其他视图如UIButton、UILabel等则设置为弱引用。