簡體   English   中英

IBOutlets應該是ivars還是屬性?

[英]Should IBOutlets be ivars or properties?

雖然我確信它們存在,但我很難找到或確定在ViewController中聲明出口的官方最佳實踐。

到目前為止,我可以看到3個選項:

  1. 僅限ivar
  2. 僅限物業
  3. 以伊瓦爾為背景的財產

當我嘗試通過從IB拖入我的ViewController來自動生成屬性時Xcode當前崩潰,但是從我記憶中,這樣做會創建一個沒有ivar的屬性。 也可以拖入ivar部分,這將創建一個沒有屬性的ivar。 這表明,僅限房產和僅使用ivar的商店對蘋果都是好的。

所以在viewDidUnload中我們需要為任何一個出口分配nil,但是dealloc呢。 如果我們使用沒有ivar的屬性,我們如何釋放我們的插座,我們不應該在init或dealloc中使用任何訪問器?

在我看來,唯一允許我們在沒有訪問器的情況下釋放我們的插座的模式是使用支持ivar的屬性,因此我們可以在dealloc中手動釋放我們的ivar而不使用其訪問器,但是這是Apple的一個選項。代碼生成不支持。

根據經驗,我通常會為IBOutlet創建訪問器。

在ARC或非ARC項目中,我通常會執行以下操作:

//.h (ARC)
@property (nonatomic, weak) IBOutlet UILabel* myLabel;

//.h (non-ARC)
@property (nonatomic, retain) IBOutlet UILabel* myLabel;

//.m
@synthesize myLabel;

通過這種方式,您可以讓編譯器為您創建實例變量。 但是您也可以聲明您的實例變量並告訴編譯器使用它。

然后,您可以在任何位置使用該訪問器/實例變量。

Apple內存管理指南說,當您有非ARC項目時,必須避免使用initdealloc方法中的訪問器方法。 所以,例如:

// (non-ARC)
- (void)dealloc
{
   [myLabel release]; myLabel = nil; // I'm using the instance variable here!
   [super dealloc];       
}

這在非ARC項目中非常重要。 原因是,如果沒有訪問器,KVC會將nib對象分配給實例變量,並對其進行保留。 如果您忘記釋放它,可能會發生內存泄漏。 使用訪問器強制您最后釋放該對象。

我強烈建議閱讀邁克·艾什(Mike Ash) 周五-Qa-2012-04-13-nib-memory-management 這是關於筆尖和內存管理的非常酷的文章。

希望能幫助到你。

這是我的理解

使用將由其他類訪問的變量的屬性,從(getters)讀取或寫入(setter)。 兩個setter和getter都是為了屬性而合成的。

將ivars用於僅由擁有類在內部使用的變量,也就是說,其他類不會設置或獲取其值。

當然,您可以使用屬性代替ivars,但只要訪問它們就會產生函數調用開銷。 因此,如果您的類有一個內部變量很多,那么函數調用將影響實時性能,這可以通過將它們聲明為ivars來避免。

暫無
暫無

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

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