强引用和弱引用有什么区别?

4

在iOS 5中,强引用和弱引用是新的概念。如果有人告诉我应该使用哪个属性,那么我们应该何时使用强引用或者弱引用呢?

@property(nonatomic,strong)

@property(nonatomic,weak)
4个回答

3

查看苹果文档,了解自动引用计数(ARC)

如果您没有时间阅读:

ARC为对象引入了几个新的生命周期限定符和弱引用。弱引用不会延长其指向的对象的生命周期,并在没有强引用指向该对象时自动变为nil。

strong是默认值。只要有一个强指针指向对象,对象就会保持“活动状态”。

weak指定不会使所引用的对象保持存活的引用。当没有强引用指向该对象时,弱引用将设置为nil。

iOS 5 ARC在自动将弱链接置空时,当卸载对象时其对象层次结构会自动设置为nil。因此,对于所有outlet属性,建议使用Weak关系。这些视图对象已经是视图控制器的视图层次结构的一部分,不需要在其他地方保留。声明您的插座弱点的最大优势是节省编写viewDidUnload方法的时间。

查看一份非常详细的文档,参考内存管理。这是在ARC之前的,但它会帮助你理解内存管理。属性的retain关键字仍然适用于ARC,并且只是strong的同义词。或者参考另一个具体的ARC教程


2

Strong意味着只要这个属性指向一个对象,那么该对象就不会被自动释放。在非ARC中,它是retain的同义词。

Weak则意味着该属性所指向的对象可以被释放,但只有当它将该属性设置为nil时才能释放。在ARC中,您使用weak来确保您不拥有它所指向的对象。


请参考以下链接以了解Objective-C中弱引用和强引用的使用:https://dev59.com/WWw05IYBdhLWcg3wVgWm - Maulik

2

strong就像retainweak就像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);
}

0

强引用和弱引用有以下区别:

1.如果我们将变量声明为强引用,则编译器不会释放该变量,直到应用程序实例在内存中。当我们将nil值设置给该引用时,它将被编译器释放。默认情况下,任何局部变量都是强引用变量。 例如: var str = "hello world"

如果我们将str = nil,则它将被释放。

2.如果我们将变量声明为强引用,则其他实例(类)将保留它,并且其保留计数将增加1。

弱引用属性。

1.当我们声明弱引用属性时,它仅包含数据/实例地址,直到强引用存在于内存中。如果强引用变量引用被释放,则它会自动设置为nil。

例如: var str = "hello world" weak var stringVar = str 假设str包含200个堆地址,我们将str = nil,则编译器会自动将弱引用属性引用设置为nil。

因此,在故事板引用控制器中,主视图只设置为强引用,其他视图如UIButton、UILabel等则设置为弱引用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接