[英]Why IBOutlet retain count is 2
為什么IBOutlet保留數是2而不僅僅是1?
和之間有什么區別
IBOutlet UILabel *fooLabel;
和
UILabel *fooLabel;
@property (nonatomic, retain) IBOutlet UILabel *fooLabel;
為什么IBOutlet保留計數是2而不是1?
你不在乎 不,說實話,你沒有。 這就是為什么人們會告訴您不要擔心保留數的原因。 您永遠不能保證它會是您期望的任何特定數字。 保留計數是可可內部實施的詳細信息。 如果框架希望將其設置為100,甚至沒有理由,則沒有理由不設置UINT_MAX
。
和之間有什么區別
IBOutlet UILabel *fooLabel;
和
UILabel *fooLabel;
@property (nonatomic, retain) IBOutlet UILabel *fooLabel;
第一個聲明一個實例變量,該變量可用作出口。 第二個聲明一個可以充當出口的屬性。 加載NIB時,在第一種情況下,將指針直接分配給實例變量,在第二種情況下,將使用訪問器分配實例變量。
絕對保留計數值與您自己的內存管理慣例無關。 不要依靠它來診斷內存管理問題。 您應該查看Apple的文檔- 此處鏈接
關於第二個問題,這里是快速概述
IBOutlet UILabel *fooLabel;
聲明fooLabel變量以及Interface Builder nib文件的出口。
UILabel *fooLabel;
如上,沒有Interface Builder的插座。
@property (nonatomic, retain) IBOutlet UILabel *fooLabel;
為您的nib文件聲明一個屬性fooLabel和一個出口。 如果使用synthesize fooLabel
合成此屬性,它將為該屬性創建getter和setter方法。 (retain)屬性告訴合成的setter方法在釋放舊值之前保留新值。
1)不要使用retainCount
來retainCount
對象的“保留狀態”- 何時使用-retainCount?
2)在這兩種情況下,都將由於KVC而保留出口對象(在第一種情況下,它是“魔術”)。 這意味着在兩種情況下,您都必須在使用dealloc
其釋放(例如,在dealloc
)。
3)保證第二個代碼段可以按預期工作,而第一個代碼段的行為看起來像是依賴於我的實現(我找不到關於非屬性ivars的有關KVC的清晰文檔)。
仔細檢查您的代碼是否明確保留了標簽([fooLabel keep])。 如果沒有,則不要釋放它兩次。 僅在dealloc中釋放它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.