2012-10-05 67 views
2

有人可以分享一些有關在init方法或指定初始值設定項中使用@property iVars的最佳實踐/代碼約定的一些知識嗎?使用@property ivars的最佳做法

請參閱我的例子:

@interface MyClass() 
@property(nonatomic,strong) nsstring *tempString; 
@property(nonatomic,strong) NSMutableArray *arrItems; 
@end 

@implementation ViewController 

- (id)init 
{ 
    if (self = [super init]) { 

     //Is this best practice/correct 
     _tempString = @""; 
     _arrItems = [[NSMutableArray alloc] initWithCapacity:0]; 
     ... 
     ... 

     //Or this 
     self.tempString = @""; 
     self.arrItems = [[NSMutableArray alloc] initWithCapacity:0]; 
    } 
    return self; 
} 

@end 

爲什麼一個或另一個應該用什麼建議?

謝謝...

+0

在您的示例中,我通常會使用屬性設置器來指定值,例如, 'self.tempString = @「一些價值」;'。原因是因爲你可能在setter中有一些自定義邏輯。例如,也許你的tempString setter想要從電話號碼中刪除破折號。如果您直接將值分配給伊娃,您將繞過該邏輯。這個想法是,如果你有一個,那麼使用setter,除非你看到一個理由不。請注意,如果您直接分配給ivars,則需要自己管理保留/複製/原子結構(setter處理此操作,除非被覆蓋)。 – Jeremy

回答

2

閱讀此線程:Why shouldn't I use Objective C 2.0 accessors in init/dealloc?

換句話說,如果你不goiung使用KVO你可以使用第二種方法:

//Or this 
     self.tempString = @""; 
     self.arrItems = [[NSMutableArray alloc] initWithCapacity:0]; 

但要小心充滿alloc-init,不要忘記autorelease。

+0

從代碼示例中'strong'的存在判斷,他必須使用ARC,所以'autorelease'不適用。 – Rob

+0

感謝您的回覆,如果我直接分配給_tempString,我不需要在ARC下保留/複製,我是否明白這一點? –

+0

是的,Rob是對的。使用ARC你不需要autorelease。 –

0

由於Jeremy提到的原因,在定義它時部分(主要是?)使用屬性符號通常會更好。

當您可以在方法setter覆蓋中設置斷點並將其應用於修改變量的所有代碼路徑時,調試特定變量將變得非常容易。

另一個原因是保持一致的內存管理模型,儘管它使用ARC以後不太重要。如果你不是那麼強壯,那麼你會確保你設置的屬性在你設置屬性的任何地方都是自動釋放的,如果你直接設置屬性,不必處理釋放當前值變量。

無論您使用何種實踐,一致性對維護/可讀性和調試都很重要。

0

我更喜歡屬性的懶惰實例化方法。

後,您@synthesize您可以覆蓋你的getter懶洋洋地實例化你的財產

例如:

-(NSString *)tempString { 

    if(!tempString) { 
     _tempString = @""; 
    } 
    return _tempString; 
} 

-(NSMutableArray *)arrItems { 

    if(!_arrItems) { 
     _arrItems = [[NSMutableArray alloc] initWithCapacity:0]; 
    } 
    return _arrItems; 
} 

如果你想設置你的財產在init方法,使用點符號self.myProperty,以便它使用定義的設置屬性而不是私有cl屁股方法直接。

0

據蘋果,你應該使用存取在init...dealloc方法:

應始終從 初始化方法中直接訪問實例變量,因爲在屬性被設置的時候,對象的其餘部分可能尚未完全初始化。即使您的 未提供自定義訪問器方法,也不知道 在您自己班級中的任何副作用,未來的子類很可能會覆蓋 的行爲。

取自該文檔:Encapsulating Data