2012-01-02 68 views
2

有什麼區別之間:和 內存管理 - 冗餘副本

第一個版本似乎是多餘的,但我懷疑它可能有我沒有看到一個好處

@synthesize something; 
… 
NSObject *tempThing = [[NSObject alloc] init]; 
self.something = tempThing; 
[tempThing release]; 

@synthesize something; 
… 
self.something = [[NSObject alloc] init]; 
,因爲我在很多例子中看到它。

回答

2

如果該屬性聲明保留例如

@property (nonatomic, retain) id something; 

那麼當你調用

self.something = newValue; 

// OR (the two are equivalent) 

[self setSomething:newValue]; 

二傳手實施將採取newValue一個保留。

因此

retain +1    retain +1 
     |      | 
+------------+ +---------------------+ 
|   | |      | 
self.something = [[NSObject alloc] init]; 

如果release伊娃somethingdealloc,那麼你將仍然有+1保留,你將不會被釋放。

要糾正這一點無論使用第一種方法(這是優選的)或添加autorelease

self.something = [[[NSObject alloc] init] autorelease]; 

那麼爲什麼要使用第一種方法? /你爲什麼在例子中看到這個?

在內存受限的環境中,控制內存是件好事。所以,當他們不再充分利用環境時,你應該明確地發佈它們。

+0

感謝Paul.s--一個非常明確的描述(對我來說)非直觀的問題。 – Andrew 2012-01-02 20:00:48

+0

@Andrew特別注意這些屬性。如果一個財產聲明沒有「保留」列出,那麼你不想發佈或autorelease,否則你會得到一個崩潰。 – MechEthan 2013-10-27 21:52:06

0

答案取決於something的財產;
如果它是retain,第一種方法是正確的,而第二種版本,則保留something兩次。因此第二方法應該是
something = [NSObject alloc] init];

如果是assign,第一種方法不會保留something,因此它應該是
self.something = [tempThing retain];

+0

感謝@Tatvamasi。該屬性是保留的,所以是「something = [[NSObject alloc] init];」最好的選擇?我認爲在不使用二傳手的情況下提到屬性並不是好的做法,但在這種情況下,它似乎是做了需要的。 – Andrew 2012-01-02 21:39:03

0

代碼的兩個例子明顯不同,但它們的實際行爲取決於您的屬性聲明。

  1. 如果屬性something具有assign屬性,那麼頂例如葉的1
  2. 用網分配的第一NSObject的保留的0計數和底部例如具有淨保留計數如果屬性somethingretain屬性:top =第一個NSObject上的計數爲1,bottom =第一個NSObject上的計數爲2
  3. 如果屬性something具有copy屬性:top =第一個NSObject的計數爲0 +第二個NSObject的計數爲1分配第二個實例!),bottom =第一個NSObject的計數爲1(第一個NSObject也泄漏了!),第二個NSObject的計數爲1。

這裏的一些評論中的例子來解釋更好:

@synthesize something; 
… 
NSObject *tempThing = [[NSObject alloc] init]; //1st NSObject: +1 retain count 
self.something = tempThing;  //1st NSObject: +0 if assign or copy, +1 if retain 
           //2nd NSObject: +1 if copy 
[tempThing release];   //1st NSObject: -1 retain count 

- 物業

@synthesize something; 
… 
self.something = [[NSObject alloc] init]; //2nd NSObject: +1 if copy 
           //1st NSObject: +1 if assign or copy, +2 if retain 

更多信息屬性在這裏:http://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/ObjectiveC/Chapters/ocProperties.html