我应该自己释放强大的属性吗?

should i release strong properties by myself?

我知道但不完全了解所有电弧的工作原理。 我知道何时使用弱属性来防止内存泄漏。 但我想了解其他事情。 如果我有 UIViewController 像这样在他内部具有强大的自定义视图: @property (nonatomic) UIView myView;(如果我们不指定任何内容,则默认为强)。 如果这个视图很弱,我知道不需要关心释放它,但是强呢? 它在我的 ViewController didDisappear / dealloc 强壮后还活着吗? 1. 我应该在 viewWillDisappear 中将此视图设置为 nil 吗? 2. 为什么当我创建一个 weak 属性 时,它在我调用它的 "init" 方法后就不再存在了?

A strong reference (which you will use in most cases) means that you want to "own" the object you are referencing with this property/variable. The compiler will take care that any object that you assign to this property will not be destroyed as long as you point to it with a strong reference. Only once you set the property to nil will the object get destroyed (unless one or more other objects also hold a strong reference to it).

Whosebug answer

所以,是的,如果您不再使用它,您应该将强属性设置为 nil。

Strong 顾名思义是由你的 class "strongly" 持有的,也就是说只要至少有一个 class 持有对那个 object,即 object 永远不会从内存中释放。如果持有 object 和 "strong" 的 class 被释放,在你的情况下你的 UIViewController,那么 object 会自动从内存中删除,你不必 在 dealloc 中手动将其设置为 nil。有一个著名的例子:

假设有 5 个孩子拿着气球,而且他们都用力握着它。只要一个孩子紧紧抓住气球,气球就永远不会飞走。现在如果有 5 个孩子,只有 一个 紧紧地抓住气球,而其他人则松散地(弱)抓住它。只要孩子紧紧抓住气球,气球就会飞走。 (我可能有点转述,但我希望你能理解!)

所以对于你的第一点,你不必每次都将它设置为 nil,除非情况需要它,就像 ARC 所做的那样。

ARC 正在计算对对象的 strong 引用。每当此计数变为零时,内存将立即释放。您不需要设置对 nil 的引用或使用 dealloc.

如果像示例中那样初始化 weak 属性,它会立即被释放,因为强引用计数为零。

weak 用于中断保留循环。一个典型的例子是代表。在以下示例中,ObjectA 对其 delegate (ObjectB) 具有强引用。这是一个保留循环,两个对象都不会被释放:

@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

让我们看看是否可以提供帮助:

If I have UIViewController with strong custom view inside him like this: @property (nonatomic) UIView myView; (the default is strong if we not specify anything). If this view was weak, I know that don't need to care about releasing it, but what about strong? Is it stay alive after my ViewController didDisappear / dealloc when it strong?

不要考虑引用计数或释放,ARC 确实可以扭转局面。 strongweak等属性与变量相关联,你可以这样理解采用以变量为中心的观点,其中变量是参与者 - 控制引用对象生命周期的实体。

采用这种观点,当引用存储到具有强属性的变量中时,变量会通知 ARC 它需要引用的对象。

从变量中删除该引用;例如通过用另一个引用或 nil 覆盖它;然后变量告诉 ARC 它不再需要引用的对象。

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

你的问题是当 ARC 删除一个对象时会发生什么,该对象的实例变量具有 strong 属性。采用以变量为中心的观点,问题就变成了:当变量本身被销毁时会发生什么?

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

  1. Should I set this view to nil in the viewWillDisappear?

如果变量本身将在您需要存储在变量中的引用所引用的对象后长期存在,则只需将具有强属性的变量设置为nil

例如如果您有一个长期存在的对象,它在其生命周期内在其实例变量之一中短期存储对大对象的引用,那么在其他时间将该变量设置为 nil 是有意义的。

  1. Why when I create a weak property it's not exist anymore after I call its "init" method?

我在这里假设你的意思是 "create an object and store a reference to it in a weak property"。

保持以变量为中心的观点,具有弱属性的变量不会像具有强属性的变量那样告诉 ARC 保留对象,而是监视引用的对象,当它消失时,它会自行设置至 nil.

如果你创建了一个对象,它只会被 ARC 保存,只要有一个对它的引用存储在一个具有 strong 属性的变量中。如果你对引用所做的只是将它存储在一个具有 weak 属性的变量中,那么 ARC 就不需要保留对象。


把变量当成上面的演员当然是打个比方,变量本身并不是活动实体。实际上发生的是,在编译期间,编译器插入指令执行上述变量的操作。结果是一样的


TL;DR:强和弱是与变量相关联的属性,而不是与引用相关联的属性。考虑 变量 的生命周期以及其中存储的内容,以确定是否保留或删除了任何对象。

HTH