1

我知道但并不完全如何所有的弧运作。 我知道何时使用弱属性来防止内存泄漏。 但我想了解别的。 如果我有UIViewController在他内部有很强的自定义视图,如下所示: @property (nonatomic) UIView myView;(如果我们没有指定任何内容,则默认为强)。 如果这种观点很弱,我知道不需要关心释放它,但强壮呢? 我的ViewController didDisappear/dealloc强壮后它还活着吗? 1.我应该在viewWillDisappear中将此视图设置为零吗? 2.为什么当我创建一个弱属性时,在我调用它的“init”方法后它不再存在了?我应该自己释放强大的属性吗?

回答

2

让我们看看,如果我们可以帮助:

如果我有UIViewController里面他强大的自定义视图像这样:@property (nonatomic) UIView myView;(默认为强,如果我们不指定任何东西)。如果这种观点很弱,我知道不需要关心它的释放,但是强大呢?它在ViewController didDisappear/dealloc强壮后仍然活着吗?

不要考虑引用计数或释放,ARC真的会变成事情。 ,等属性与变量相关联,您可以通过采用以变量为中心的视图来理解此变量,其中变量是角色 - 控制引用对象的生命周期的实体。

将参考存储到具有强属性的变量时采用此视图,然后该变量通知ARC它需要参考对象留在附近。

从变量中删除该引用;例如通过用另一个参考或用nil覆盖它;那么变量告诉ARC它不再需要被引用的对象留下来。

只要至少有一个变量告诉ARC该对象是必需的并且尚未撤回该要求,ARC本身只会保留一个对象。

你的问题是当ARC删除一个具有强属性的实例变量的对象时会发生什么。以变​​量为中心的观点,问题变成:变量本身被破坏时会发生什么?

答案是具有强属性的变量的最后一个行为。并有一个存储在其中的引用,告诉ARC该变量不再需要引用的对象被保留。

  1. 我应该在viewWillDisappear中将此视图设置为零吗?

你只需要设置其具有较强的属性nil如果变量本身将继续存在很长,你还得有人被存储在变量的引用引用的对象后的变量。

E.g.如果你有一个很长的生命对象,它在其生命周期中在其中一个实例变量中短时间存储对象,那么在其他时间将该变量设置为nil是有道理的。

  1. 为什么当我创建一个弱属性时,在我调用它的“init”方法之后它就不存在了?

我在这里假设你的意思是“创建一个对象并在弱属性中存储对它的引用”。

保持以变量为中心的视图,具有弱属性的变量不会告诉ARC将对象保留在周围,与强属性一样,而是监视所引用的对象,并在其消失时将其自身设置为nil

如果您创建一个对象,只有存在一个引用它的对象时,它才会被ARC保留,而该引用存储在具有强属性的变量中。如果你对引用的所有操作都将其存储在一个具有弱属性的变量中,那么ARC就不需要保持该对象。


处理所述变量如上演员当然是一个类比,变量本身是不活动的实体。实际上发生的事情是,在编译期间,编译器会插入执行上述变量的指令。结果是一样的。


TL; DR:强&弱与变量不与引用相关的属性。考虑变量的存在时间以及存储在其中的内容以确定是否有任何对象被保留或移除。

HTH

+0

哇多么美丽的答案,谢谢! –

0

强大的引用(在大多数情况下,您将使用它)意味着您要“拥有”您使用此属性/变量引用的对象。编译器会小心,只要你指向一个强引用,你分配给这个属性的任何对象都不会被销毁。只有当你将属性设置为零时,对象才会被销毁(除非一个或多个其他对象也强烈引用它)。

Stackoverflow answer

所以,是的,你应该设置你的强大的属性,以零,如果你不使用它了。

0

Strong顾名思义就是你的类“强”地持有,也就是说只要有至少一个类持有对该对象的引用,该对象将永远不会从内存中释放。如果拿着“strong”对象的类被取消分配,那么在你的情况下你的对象被自动从内存中移除,并且你的不需要必须在dealloc中手动设置它为nil。有一个着名的例子:

想象一下,5个孩子拿着气球,他们都强烈地拿着它。只要一个小孩坚持不懈,气球就永远不会飞走。现在,如果有5个孩子,只有一个强烈地抓住气球,其他人则松散(弱)。只要小孩坚持下去,气球就会飞走。 (我可能会解释一下,但我希望你能理解!)

因此,对于你的第一点,你不必每次都将它设置为零,除非情况需要它,因为它是由ARC完成的。

0

ARC对一个对象的引用计数为strong。只要此计数为零,内存就会立即释放。您无需设置对nil的引用或使用dealloc

如果您在您的示例中初始化weak属性,它将立即释放,因为强引用计数为零。

weak用于打破保留周期。一个典型的例子是代表。在以下示例中,ObjectA对其delegateObjectB)有很强的参考。这是一个保留周期,这两个对象永远不会被释放:

@protocol ObjectADelegate <NSObject> 
    // requirements 
@end 

@interface ObjectA : NSObject 
    @property (strong) id<ObjectADelegate> delegate; 
@end 

@interface ObjectB : NSObject <ObjectADelegate> 
    @property (strong) ObjectA *instanceA; 

@end 

@implementation ObjectB 

- (instancetype)init { 
    self = [super init]; 
    if (self) { 
     self.instanceA = [ObjectA new]; 
     self.instanceA.delegate = self; 
    } 

    return self; 
} 

@end 

要解决这个问题,打破保留周期,您将委托财产weak

@interface ObjectA : NSObject 
    @property (weak) id<ObjectADelegate> delegate; 
@end 
相关问题