看過好幾次這種描述:在初始化方法或是 dealloc 中最好不要使用屬性,因為無法確定 self 到底是不是確實呼叫的是你想要的實例,這個是為什麼呢?
在哪裡看的?那都是陳年往事了,ARC 裡沒有限制,隨便用。
以前手動管理記憶體的年代,因為呼叫屬性會涉及到引用計數器的加減,而 self = [super ...] 初始化的对象不一定是当前类的对象,可能是“变体”或私有类(objc里的class有 class 和 metaclass 的区别),所以在你不知道属性 setter 方法里到底是怎么加减引用计数器的情况下,你就只针对 ivar 進行 retain 和 release 就行了。
self = [super ...]
class
metaclass
ivar
- (id)initWithString:(NSString *)str { self = [super init]; if (self) { _foo = [str copy]; } return self; } - (void)dealloc { [_foo release]; [super dealloc]; }
retain(copy,new) 和 release 成對出現
因為會產生循環引用,比方delegate,然後造成永遠也釋放不掉
因為有分類(Category)以及setter以及getter以及KVO等需要注意最主要的是因為分類.語法可以調用分類的屬性及方法,但是_就不行了,需要注意
在哪裡看的?那都是陳年往事了,ARC 裡沒有限制,隨便用。
以前手動管理記憶體的年代,因為呼叫屬性會涉及到引用計數器的加減,而
self = [super ...]
初始化的对象不一定是当前类的对象,可能是“变体”或私有类(objc里的class有class
和metaclass
的区别),所以在你不知道属性 setter 方法里到底是怎么加减引用计数器的情况下,你就只针对ivar
進行 retain 和 release 就行了。retain(copy,new) 和 release 成對出現
因為會產生循環引用,比方delegate,然後造成永遠也釋放不掉
因為有分類(Category)以及setter以及getter以及KVO等需要注意
最主要的是因為分類.語法可以調用分類的屬性及方法,但是_就不行了,需要注意