2010-08-21 85 views
0

我有分配和釋放的對象問題:目標C setter方法內存管理

,如果我有這樣的代碼:

MyObject *object = [[MyObject alloc] init]; 
NSMutableString *string = [[NSMutableString alloc]initWithString:@"bla"]; 
object.myString = string; 
NSLog(@"retain count: %d",[object.myString retainCount]); //gives me 2 
[string release]; 
NSLog(@"retain count: %d",[object.myString retainCount]); //gives me 1 

比我正是我想要的。我需要的只是一個參考,我有保留計數1

如果我使用

object.myString = [[NSMutableString alloc]initWithString:@"bla"]; 

我的財產是這樣的:

@property (nonatomic,retain) NSMutableString *myString; 

一個ALLOC和一個setter方法保留給我作爲保留計數2

如果我在辭職後釋放對象比應用程序崩潰。我不知道爲什麼?

那麼,我是否必須始終使用臨時引用創建對象,而不是分配給真實引用並釋放臨時引用,如第一個代碼?

或者還有其他方法嗎?

+0

您遺漏了有關如何釋放myString以及發生崩潰的詳細信息,因此很難說出發生了什麼問題。在理論上調用'[object.myString release]'應該是可以的,但object.myString始終可能不會返回原始對象。如果您想了解原因,請使用全局斷點捕獲導致應用程序崩潰的異常。 「如何」指示設置不應該太難找到。 – benzado 2010-08-21 19:54:54

回答

1

是的,沒有。通常,這是一種常見模式:

// create the object, retain count 1 
MyObject *myObject = [[MyObject alloc] init]; 

// increment the retain count in the setter 
self.myObjectProperty = myObject; 

// let go of the object before the end of the current method 
[myObject release]; 

您可以通過使用autorelease池避免發佈,排序。更準確地說,表明您希望對象很快被釋放:

MyObject *myObject = [[[MyObject alloc] init] autorelease]; 
self.myObjectProperty = myObject; 

// all done! 

與許多蘋果提供的類的,你可以用比分配/初始化其他類的方法來獲取已經自動釋放的對象。您的例子可以寫成:

MyObject *myObject = [[MyObject alloc] init]; 
myObject.myString = [NSMutableString stringWithFormat:@"bla"]; 

最後請注意:-retainCount是鈍器。特別是使用NSString和其他內置類時,它可能會返回與您期望的結果完全不同的結果。一般你應該避免它。

+0

感謝您的回覆。我使用Objective-C進行iphone應用程序開發,這就是爲什麼我通常不想使用autorelease池。 當我使用蘋果提供的類時,我不使用發佈它是好的。 我真的想知道 以下代碼是否正確 object.myString = [[NSMutableString alloc] initWithString:@「bla」]; [object.myString發佈]; 還是我需要再次發佈? – jourbus 2010-08-21 20:00:49

+0

這個順序很好,但是除非你製作了大量的字符串,否則你的應用程序是一個主要的內存管理器,我真的不用擔心在這裏和那裏使用自動釋放對象。請注意,在' - [MyObject dealloc]'中應該有更多版本。如果你有,那麼你已經適當配對你的保留和釋放。 – 2010-08-21 20:07:11

+0

非常感謝 – jourbus 2010-08-21 20:17:52