簡體   English   中英

為什么IBOutlet保留計數為2

[英]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時,在第一種情況下,將指針直接分配給實例變量,在第二種情況下,將使用訪問器分配實例變量。

  1. 絕對保留計數值與您自己的內存管理慣例無關。 不要依靠它來診斷內存管理問題。 您應該查看Apple的文檔- 此處鏈接

  2. 關於第二個問題,這里是快速概述

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)不要使用retainCountretainCount對象的“保留狀態”- 何時使用-retainCount?

2)在這兩種情況下,都將由於KVC而保留出口對象(在第一種情況下,它是“魔術”)。 這意味着在兩種情況下,您都必須在使用dealloc其釋放(例如,在dealloc )。

3)保證第二個代碼段可以按預期工作,而第一個代碼段的行為看起來像是依賴於我的實現(我找不到關於非屬性ivars的有關KVC的清晰文檔)。

仔細檢查您的代碼是否明確保留了標簽([fooLabel keep])。 如果沒有,則不要釋放它兩次。 僅在dealloc中釋放它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM