2011-07-30 15 views
0

可能重複:
Use autorelease when setting a retain property using dot syntax?iPhone ivars vs使用自我:不需要autorelease?

有什麼用實例變量和自我之間的區別。符號?

instanceVar是使用retain聲明的實例變量。

1)instanceVar = [[NSMutableArray alloc] initWithObjects:@「1」,@「2」]; //我需要在這裏autorelease ????? 2)self.instanceVar = [[NSMutableArray alloc] initWithObjects:@「1」,@「2」] autorelease];

另外,我需要在第一種情況下autorelease?

+0

其中包括:[搜索:objc屬性autorelease](http://stackoverflow.com/search?q= [objc] +保留+屬性+ autorelease) –

回答

2

這在多個地方進行了說明,但似乎你問的不同是什麼

第一個電話是不變的,看起來像這樣:

instanceVar = [[NSMutableArray alloc] initWithObjects:@"1", @"2"]; 

第二個電話時,編譯會是這個樣子(假設你已經使用了@propertyretain@synthesize

self.instanceVar = [[NSMutableArray alloc] initWithObjects:@"1", @"2"]; 
// The previous line will compile to this next line 
[self setInstanceVar:[[NSMutableArray alloc] initWithObjects:@"1", @"2"]]; 

- (void)setInstanceVar:(NSMutableArray *)instanceVar;方法的身體會是這個樣子(編譯器創建這個給你,因爲您@property@sythesize):

- (void)setInstanceVar:(NSMutableArray *)anInstanceVar 
{ 
    if (instanceVar != anInstanceVar) { 
     [instanceVar release]; 
     instanceVar = [anInstanceVar retain]; 
    } 
} 
呼叫

因此

self.instanceVar = [[NSMutableArray alloc] initWithObjects:@"1", @"2"]; 

您對新創建的NSMutableArray擁有+1保留數,然後您通過設置員添加+1保留數。

這意味着你需要額外的版本來匹配你正在使用的保留。在iPhone中不使用autorelease會更好,因此您可以確保內存在您需要時被釋放。因此,你通常應該取圖案

  1. 創建局部變量
  2. 分配局部變量通過二傳手
  3. 釋放局部變量

它看起來像這樣(FIXED感謝@jamapag)到伊娃

NSArray *tmpMyArray - [[NSArray alloc] initWithObject:@"Hello"]; 
self.myArray = tmpMyArray; 
[tmpMyArray release]; tmpMyArray = nil; 
+0

在上一個例子中,你創建了自動釋放的NSArray(沒有alloc),所以你不需要釋放它。正確的代碼是:[[NSArray alloc] initWithObject:@「Hello」]' – jamapag

+0

好點的是試圖在瀏覽器中不經測試而急速編碼 –

+0

爲什麼最後一個例子更好?在所有這些中,數組似乎都會在內存中,直到它在dealloc中被釋放。 –

0
1) instanceVar = [[NSMutableArray alloc] initWithObjects:@"1", @"2"]; //do I need autorelease here????? 

的NSMutableArray裏用的1擋計數創建的,你需要釋放你的instanceVar在dealloc()方法

2) self.instanceVar = [[NSMutableArray alloc] initWithObjects:@"1", @"2"] autorelease]; 

在這裏,您使用的是二傳,並因爲它宣佈與retain它會將其保留計數增加1,alloc init已將保留計數增加1,因此總保留計數爲2.但是,autorelease msg會在下一次運行循環中將其減少1 probaby。所以你只需要在你的dealloc()方法上發佈這個。

在你可能不要要自動釋放第一種情況,因爲這是伊娃,你可能會想再次使用它,如果你autorelease它保留計數爲0不久(最有可能在未來跑環)