首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Objective-C @property內存管理:retain屬性為何計數不增加?

     編輯:程式設計綜合問答

問題場景

對象alloc後引用計數為1,賦值給retain屬性預期計數+1變為2,但實際觀察計數仍為1。代碼片段:

@property (nonatomic, retain) TestJob *myObject;

// 使用時
_myObject = [testJob retain]; // 未走setter

核心原理

@property (retain)的retain語義僅在setter方法內生效。直接賦值給實例變量_myObject繞過了setter,因此不會觸發retain操作。

正確用法對比

方式代碼計數變化
❌ 錯誤_myObject = [obj retain];不觸發setter,屬性語義失效
✅ 正確self.myObject = obj;自動調用setter,retain生效
✅ 手動[self setMyObject:obj];顯式調用setter,效果相同

內存管理鐵律

  1. 永遠通過self.property = ...或[self setProperty:...]賦值
  2. 直接操作_ivar需手動管理引用計數
  3. ARC環境下編譯器自動插入retain/release

調試技巧

可重寫setter加日誌驗證:

- (void)setMyObject:(TestJob *)obj {
    NSLog(@"setter called, retainCount before: %lu", [obj retainCount]);
    _myObject = obj;
    NSLog(@"retainCount after: %lu", [obj retainCount]);
}

理解「屬性語義=setter行為」是掌握OC內存管理的關鍵。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved