2012-05-28 27 views
1

假設我後來有屬性訪問的點語法或括號語法是否正確?

@interface A : NSObject 
@property (nonatomic, strong) NSMutableArray *array; 
@end 

在另一類B,我想訪問該陣列,要檢查多少項目都在上面。我可以做B兩件事情之一(aA一個實例):

選項1

[a.array count] 

選項2

[[a array] count]; 

哪個選項是做到這一點的最好方法是什麼?當使用[a array]作爲getter方法時,選項2是訪問陣列的正確方法嗎?

+1

[Objective-C:message syntax vs. dot syntax;有什麼區別?](http://stackoverflow.com/questions/4259946/objective-c-message-syntax-vs-dot-syntax-whats-the-difference) –

回答

3

兩者都是相同的,如果你有合成數組。在第一個中,您只需調用該屬性,而在第二個中調用由@synthesize動作生成的getter方法。

,並確保第二個選項是正確的方式@synthesize使得兩種方法

1吸氣即相同屬性名 2-二傳手是在啓動與第一個字母captial添加集與屬性名像setArray。

0

直到您決定重命名生成的getter/setter方法並且該消息可能變爲無效時,沒有區別。

對於公衆的實例變量,你可以跳過訪問方法(包括屬性和方法的風格),使用結構引用操作:

@interface A : NSObject 
{ 
    NSMutableArray *array; 
} 

@property (nonatomic, strong) NSMutableArray *array; 
@end 

classA.m

[self->array count]; 

classB.m

[a->array count]; 

這樣做,您放棄操作和備忘錄的便利性ry管理優化,您可以使用具有不同屬性的屬性(兩種訪問方式),請參閱more

作爲例如用於NSString的屬性

@property (readwrite, copy) NSString *sVar; 

所生成的設定器看起來像這樣:

-(void)setSVar:(NSString*)inSVar 
{ 
     if (self->sVar != inSVar) 
     { 
       [self->sVar release]; 
       self->sVar = [inSVar copy]; 
     } 
} 
1

有如果已合成的陣列,作爲薩阿德所述兩者之間沒有差別。不過,我建議使用括號語法,以便在所有方法調用中保持一致,因爲所有其他Objective-C方法(除了來自C的函數)都使用括號語法來調用。