2013-03-05 47 views
0

請參閱代碼如下:誰應該負責釋放setter的參數?

- (void) setSomeThing:(NSString *) someThingNew 
{ 
    if(someThing!=someThingNew) 
    { 
     [someThingNew retain]; 
     [someThing release]; 
     someThing = someThingNew; 
    } 
} 

... ... 
- (void) dealloc 
{ 
    [someThing release]; 
    [super dealloc]; 
} 
@end 

二傳手someThingNew的參數已經retain在setter方法,這意味着它的保留計數爲1

這裏的問題是:是someThingNew應該release

還是因爲someThingsomeThingNew指向同一個對象,並在dealloc方法someThing一直release所以someThingNewnil

+3

Objective C的內存管理指南:http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/MemoryMgmt/Articles/MemoryMgmt.html – Kreiri 2013-03-05 13:42:59

回答

1

是someThingNew應該釋放嗎?

沒有,因爲現在someThingsomeThingNew指向相同的地址。通過在dealloc中釋放someThing(並且無法保證安全,但這是另一個問題),您可以在setter中平衡保留。一切順利精細*

*旁註:中NSString實例通常copy「d,不retain d,在制定者,所以如果你不小心通過NSMutableString它也沒關係。

+0

首先謝謝你,但是什麼是「itr」呢? – Michael 2013-03-05 22:31:22

+0

我的歉意,我不小心鍵入了'r'而不是一段時間。 – CodaFi 2013-03-05 22:53:58

+0

旁註是偉大的:) – 2013-03-06 02:05:31

0

每當你的setter方法被調用someThingNew被保留,someThing被釋放。然後someThingNew的新地址被存儲在一些Thing中,使得保留計數爲1.

這將一直保留在類中,直到對象本身未被釋放爲止。一旦dealloc被稱爲someThingNew的指針被釋放,使得保留計數爲0.

+0

因此,這意味着[SOMETHING發佈]實際上釋放一些Thing和一些ThingNew。非常感謝。 – Michael 2013-03-05 22:36:37

0

你的代碼是正確的:如果你想讓它成爲一個「強」變量,setter應該保留這個對象。但是你不必釋放它:它不是二傳手的責任區。因此,在您撥打設定器的代碼中,您將:

  • 分配要分配的對象;
  • 致電setter;
  • 當你不再需要時釋放它。

你做得很好,除了字符串通常被複制的事實,因爲多態性是有效的,指針可能指向一個可變的字符串對象,因此它可能會從一個時刻改變到另一個時刻。

例子:

NSAutoreleasePool* pool=[[NSAutoreleasePool alloc]init]; 
NSString* newString= [[NSMutableString alloc]initWithString: @"Hello"]; // Retain count 1. 
[newString autorelease]; // Still 1 as retain count, but it will be decreased 
         // when the pool will be drained. 
[object setSomeThing: newString]; // Retain count 2. 
[pool drain]; // Retain count 1 

在這個例子中,你清楚地看到,爲什麼你需要的複製對象,而不是將其保留:這是一個可變的字符串,因此它可以在任何時間進行修改。

複製對象

如果複製的對象,那麼你是如何調用該方法(因此上面的代碼)不改變的方式,它只是改變了方法實現。事情是這樣的:

- (void) setSomeThing:(NSString *) someThingNew 
{ 
    if(someThing!=someThingNew) 
    { 
     [someThing release]; // Retain count decreased by 1. 
     someThing = [someThingNew copy]; // Retain count 1. 
    } 
} 

... ... 
- (void) dealloc 
{ 
    [someThing release]; 
    [super dealloc]; 
} 
@end 
+0

在第一個地方我會問兩個問題第一個是這個,第二個是保留和複製之間的不同。你只需一起回答。我真的想投你的答案,但我沒有足夠的聲譽。謝謝你的工作。 – Michael 2013-03-05 22:43:23

+0

複製會創建一個不同的對象,並擁有自己的保留計數。當您創建一個新對象時,其保留計數爲1.當然,複製的對象將位於與原始對象不同的內存區域中。我已經添加了一個例子。 – 2013-03-05 22:55:30

+0

謝謝!這裏有一個問題:你沒有在dealloc方法中釋放someThingNew,你的意思是一些ThingNew應該在其他地方釋放? – Michael 2013-03-06 00:21:30