ARC的强大属性是否需要self.iVar?

ma1*_*w28 17 objective-c llvm automatic-ref-counting

  1. 如果我宣布一个强大的财产,如下:

    @property (strong, nonatomic) UIView *iVar;
    
    Run Code Online (Sandbox Code Playgroud)

    当我设置它,它的问题,如果我做的iVar = ...还是self.iVar = ...?似乎用ARC,他们做同样的事情.

  2. 如果我只声明实例变量(不是@property),例如,BOOL selected那是否意味着它被推断为__unsafe_unretained(因为没有指定它强的属性),或者我必须明确指定它吗?

在回答ARC时,我似乎已经回答了我自己的问题:如何释放静态变量?,但我仍然对上述问题略感困惑.

Lil*_*ard 20

从内存管理的角度来看,使用ivar = ...self.property = ...(注:有没有这样的事情作为self.ivar)是相同的.但是,使用时ivar = ...不会调用setter self.property = ....这有三个重要的后果,没有特别的顺序:

  1. 如果没有标记属性nonatomic,那么访问底层的ivar将不会获得锁定,您将打破原子性含义.
  2. 如果由您或子类重写该属性,则不会调用重写的setter.
  3. 不会发送KVO通知.

至于仅声明ivar,它具有与声明局部变量相同的内存管理语义.这在Objective-C自动引用计数文档的4.4节中有记录,但基本上,如果它是一个对象,它将被推断为__strong.