2012-04-18 50 views
0

我正要重構我當前的iOS項目以使用ARC。在預覽更改後,使用「Refactor to ARC」工具(我xCode)將當前代碼遷移到ARC,我可以看到我當前的代碼約定可能不適用於ARC。因爲它增加了很多__weak/__strong等我的ivars。使用ARC的Objective-C屬性

我目前的慣例繼承人如何:

我定義所有實例變量爲私有或受保護的ivars。和所有公共變量我創建一個@屬性。

@interface TestClass 
{ 
@private 
NSMutableArray* mArray; 
NSString* mString; 
BOOL mMyBoolean; 
} 

@property (retain, nonatomic) NSString* string; // public 
@end 

中的所有對象,我總是回用@property,避免處理釋放/保留,所以如果我有一個私有變量,它是引用,我只是創建在執行一個類別。結構(如mMyBoolean)我只是將其定義爲一個ivar。

@interface TestClass() 
@property (retain, nonatomic) NSmutableArray* mArray; 
@end 

@implementation TestClass 
@synthesize string = mString; 
@synthesize mArray; 

@end; 

但是因爲新的ARC正在照顧保留/發佈我正確地不需要私有變量支持@property。

那麼什麼樣的代碼約定更合適?我一直在考慮在界面中定義屬性,如下所示:

@interface TestClass 
{ 
@private 
NSMutableArray* mArray; 
BOOL myBoolean; 
} 

@property (strong, nonatomic) NSString* string; 
@end 


@implementation TestClass 
@synthesize string; 
@end 

並且不使用私有屬性的類別屬性。 (我也刪除了「m」前綴),我沒有定義@property應該使用的支持ivar,而是我只是讓xcode使用它的自動生成?

回答

1

這是一個更具風格的問題,所以......很難客觀回答,但我會投入我的兩分錢。據我所知,你在做什麼沒有任何問題。如果你的目標是看看你能做些什麼來獲得更清晰的代碼,那麼我會分享我的命名約定(儘管一個人的垃圾是另一個人的寶藏,所以如果你不喜歡它,那麼......好強硬哈哈,你不要不必帶走任何東西)。

1)iVars以m開頭,從不公開。

2)屬性綜合爲一個以underbar(_)開頭的變量名,除非我需要繼承類才能在內部修改只讀變量,否則不需要顯式支持變量,在這種情況下,我需要將其移動到公共接口(我仍然用一個底條命名它來表明它是一個屬性變量)。屬性是爲了通過一個接口公開一些信息,但是由於實現可以訪問所有的東西,所以它沒有任何意義,除了以下情況,我從不在私有接口中使用屬性:

3)延遲加載,或者以其他方式具有除了簡單地分配給變量之外的邏輯。在這種情況下,如果我只重寫getter或setter(不是兩者),我仍然會合成(_)並覆蓋所需的方法(不需要顯式變量)。如果我重寫兩個,我不合成,那麼顯然我需要一個明確的後備變量(不要忘記調用KVO方法^^)。

沒有「正確」的方式來做這種我想象的東西......這似乎是通用的唯一準則是

1)這樣做的方式,你和您的團隊可以很容易地理解

2)這樣做始終

3)在的情況下API,只需查看頭文件即可輕鬆理解。

+0

+1爲始終如一。使用ARC可以很容易地混合和匹配直接ivars和屬性,但它可以變得有點難看 – jrturton 2012-04-18 08:09:46

+0

謝謝!當我寫這個問題時,我意識到它可能是抽象的,但我認爲你做了一個偉大的工作,概述了公約背後的真實想法。 – 2012-04-18 11:06:27