- 如果我声明一个强大的属性,就像这样:
@property (strong, nonatomic) UIView *iVar;
当我设置它时,如果我做 iVar = ...
或 self.iVar = ...
这有关系吗?似乎用ARC,他们做同样的事情 .
- 如果我只声明实例变量(不是@property),例如
BOOL selected
,这是否意味着它被推断为__unsafe_unretained
(因为没有指定它强的属性),或者我必须明确指定它吗?
在回答ARC: How to release static variable?时似乎我可能已经回答了我自己的问题,但我仍然对上述问题感到有些困惑 .
1 回答
从内存管理的角度来看,使用
ivar = ...
或self.property = ...
(注意:没有self.ivar
这样的东西)是一样的 . 但是,在self.property = ...
时,使用ivar = ...
不会调用setter . 这有三个重要的后果,没有特别的顺序:如果该属性未标记为
nonatomic
,则访问基础ivar将不会获取锁定,您将破坏原子性含义 .如果由您或子类覆盖该属性,则不会调用被覆盖的setter .
将不会发送KVO通知 .
至于仅声明ivar,它具有与声明局部变量相同的内存管理语义 . 这在section 4.4 of the Objective-C Automatic Reference Counting文档中有记录,但基本上,如果它是一个对象,它将被推断为
__strong
.