2012-09-19 131 views
1

這裏使用時不同的伊娃更名保留計數2碼snapshot-是否與財產

@interface A:NSObject 
{ 
    NSMutableArray *a; 
} 

@property (retain) NSMutableArray *a; 


@implementation 

@synthesize a; 

-(id)init 
{ 
     if(self=[super init]) 
    { 
      a=[[NSMutableArray alloc] init]; 
    } 
} 

@end 


@interface A:NSObject 
{ 
    NSMutableArray *_a; 

} 

@property (retain) NSMutableArray *a; 



@implementation 

@synthesize a=_a; 

-(id)init 
{ 
     if(self=[super init]) 
    { 
      _a=[[NSMutableArray alloc] init]; 
    } 
} 

@end 

現在我需要知道,在這兩個代碼實例變量賦值,而不是直接使用訪問和保留計數是1?或者它們之間有區別。謝謝。

還有一件事,蘋果建議不要在init/dealloc中使用存取器,但同時要求不要直接設置iVar。那麼在init()中賦予ivar值的最好方法是什麼?

+0

是什麼這...那我甚至沒有實際的Objective-C代碼。 – TheAmateurProgrammer

+0

你應該修復你的代碼。它格式不正確。你也可以詢問兩個不同的代碼摘錄之間的區別,但你只發布了一個。 –

回答

1

ARC與非ARC

首先,你應該決定是否要使用自動引用計數(ARC)或手動引用計數。看起來你已經選擇了後者 - 這很好,因爲你以後可以隨時轉換到ARC。

物業屬性/ setter方法語義

您已經標記爲屬性aretain二傳手語義。這將起作用;但由於該屬性暴露在類接口中,所以類用戶可以使用它來設置伊瓦爾_a。因爲班級用戶可能不希望您的班級A直接修改他們通過的實例NSMutableArray,所以最好使用copy語義來表示可變對象特性。在init

財產准入和initdeallocdealloc

使用聲明的屬性往往是氣餒,因爲這樣做可能有副作用,由於志願。這些副作用可能不適用於部分構建或部分解構的對象。

您的問題

這裏是我會做:

// assumes Xcode 4.4+ for autosynthesize 
@interface A:NSObject 
@property (nonatomic,copy) NSMutableArray *a; 
@end 

@implementation A 

- (id)init { 
    self = [super init]; 
    if(!self) return nil; 

    _a = [[NSMutableArray alloc] init]; 

    return self; 
} 
@end 

編輯:

或者,如果自動合成爲不可用:

@interface A:NSObject 
@property (nonatomic,copy) NSMutableArray *a; 
@end 

@implementation A 

@synthesize a = _a; 

- (id)init { 
    self = [super init]; 
    if(!self) return nil; 

    _a = [[NSMutableArray alloc] init]; 

    return self; 
} 
@end 
+0

嗨艾倫,謝謝你的迴應。但是,如果我們在非ARC環境中使用Xcode 4.0,代碼會怎樣? – russell

+0

當然,請參閱編輯。 – FluffulousChimp

+0

「Apple建議不要在初始化器和dealloc中使用屬性」 - 這意味着我們應該使用_a而不是self.a ?? – russell

0

上面提到的兩個代碼沒有區別。在最新的編譯器中,您現在不需要使用屬性指定實例變量。所以上面的代碼現在將是:

@interface A:NSObject 
@property (strong) NSMutableArray *a; 
@end 

@implementation 
-(id)init 
{ 
    if (self = [super init]) 
    { 
     _a = [[NSMutableArray alloc] init]; 
    } 
    return self; 
} 

@end 

在這種情況下,屬性「a」是具有自動合成和_a是一個實例變量。基本上_前綴屬性名稱是實例變量名稱。

如果在ARC中沒有發佈。使用self.a訪問其他地方。

您正確地表示Apple建議不要在intializers和dealloc中使用屬性,因爲它們沒有初始化。

並回答您的問題:「與屬性一起使用時,不同的iVar名稱更改保留計數」是使用屬性時,您不應該擔心這一點。它可能在短時間內有不同的保留計數,但對您或代碼無關緊要。

希望它有幫助。