2012-10-17 21 views
1

可能重複:
Difference between self.ivar and ivar?有關在Objective-C中訪問實例屬性的最佳實踐?

我不知道,如果我定義一個實例變量作爲OBJ - C的屬性,例如,

@property (copy) NSString *str; 

@synthesize str = _str; 

應該由我

_str = @"ABC"; 

訪問它的實例方法內,或者我應該使用的訪問,這是

[self setStr:@"ABC"]; 

是否有這方面的任何一般原則?

非常感謝!

+0

檢查了這一點http://stackoverflow.com/questions/6112283/question-about-synthesize – Kamarshad

回答

7

這沒關係閱讀從類中的實例變量:

NSLog(@"str = %@", _str); 

但不要直接設置實例變量:

_str = @"ABC"; // No! 

這繞過copy機制你已經所以仔細地放在你的財產。所以這樣做代替:

[self setStr:@"ABC"]; // Ok 
self.str = @"ABC"; // Ok, shorter 
2

我有點不同意@Dietrich繪製這樣一個強硬的路線。利用屬性獲取器和設置器是非常有效的,並提供額外的東西作爲一個好處,例如對關鍵值編碼的自動支持,但是他們也有做額外的東西的缺點。作爲一種實踐,沒有外部對象應該直接訪問對象成員變量,但是您可以控制和選擇是否直接訪問和設置類中的成員變量。

PROS直接訪問:

1)速度更快 - 它可能看起來並不多,但每次使用的方法,而不是直接時候訪問您蒙受功能開銷的變量 - 在一個循環做到這一點,成本不是微不足道的。

2)明確的 - 你知道,當你設置用於直接訪問的變量

缺點究竟是什麼改變:

1)的getter和setter多態性的損失 - 直接你失去訪問變量子類可以擴展那些吸取器和設置器的功能,這從OOP角度來看可能是不可取的(但是再一次,這也可能是一個好處,取決於你的架構)

2)KVO損失(或至少使它更難) - 關鍵的價值觀可以是綁定changin的非常酷的方式g的成員變量值添加到方法回調中以引發某種事件驅動的更改(主要是將屬性綁定到UI佈局/顯示等)。KVO並不適合每個人。

3)失去自動同步(當聲明爲原子時) - 有時你需要你的成員變量是線程安全的。這是消除鍋爐板代碼的主要優點。

最終,這取決於您作爲開發人員。實際上,我傾向於直接向成員變量訪問,除了當我構建一個線程安全的對象或對擴展和KVO具有體系結構健壯性時。

希望這可以幫助,選擇是你的! :)