簡體   English   中英

內部屬性與ivars

[英]Internal properties versus ivars

當我需要私有對象時,我目前使用屬性,如下所示:

// Class extension in .m file
@interface MyClass()
@property (strong, nonatomic) NSArray* myInternalArray;
@end

self.myInternalArray = something; 

或者你可以這樣做:

@implementation MyClass {

    NSArray* _myInternalArray;
}

_myInternalArray = something;

沒有自定義setter或getter,兩者是等價的。 內部變量的最佳實踐是什么? 一種方法比另一種方法有什么優勢嗎?

雖然有些人可能認為選擇是一個偏好問題,並且他們確實有一個觀點,但是有一個很好的理由,即大多數現代語言都支持屬性並使它們更容易和更容易編碼。

ARC的引入並沒有顯着降低屬性的價值。 這一切都歸結為這一點 - 在一個屬性中,你已經封裝了變量的使用。 這種封裝在需要時是非常寶貴的,而在不需要時則沒有多少開銷。

例如(從頭頂開始)假設您發現需要在保存之前驗證該值。 如果您使用的是iVar,則必須確保在使用iVar的任何地方,您必須先調用驗證代碼,然后才能更改其值。 使用屬性,您只需要覆蓋setIVarName:並將驗證放在那里。 有人可能會說,一個人就像另一個人一樣容易 - 在許多情況下可能都是這樣,但iVar在這里有一個障礙 - 你無法確保未來的變化(由你或其他程序員)將在之前插入驗證iVar改變了。 在這里使用房產確實有這種保證。

就個人而言,我盡可能使用iVars上的屬性。

我會說,屬性的優點是你可以使用setter,並且setter可以獨立於調用它們的代碼而發展。 例如,您可以決定設置屬性現在會觸發setNeedsLayout。 通過從頭開始使用屬性,您無需重構現有代碼。

這種模式非常適合Cocoa / iOS API,在更改其屬性后,您無需要求系統對象執行任何操作:setters可立即確保內部和UI一致性。

屬性是私有的這一事實不應該讓我們將它們實現為二等屬性,你怎么看?

暫無
暫無

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

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