2010-06-06 60 views
2

請給我一些關於如何更改NSString變量的建議。在爲它分配新值之前,我應該釋放NSString嗎?

在我的課,我設置的成員VAR:

NSString *m_movieName; 
... 
@property(nonatomic, retain) NSString *m_movieName; 

在viewDidLoad方法中,我指定一個默認名稱此變種:

-(void)viewDidLoad{ 
NSString *s1 = [[NSString alloc] initWithFormat:@"Forrest Gump"]; 
self.m_movieName = s1; 
... 
[s1 release]; 
[super viewDidLoad] 
} 

在一些功能,我想給一個這個var的新名稱,所以我喜歡:

-(void)SomeFunc{ 
NSString *s2 = [[NSString alloc] initWithFormat:@"Brave Heart"]; 
//[self.movieName release]; // ??????? Should perform here? 
self.m_moiveName = s2; 
[s2 release]; 
} 

我知道,NSString * var只是一個指向已分配內存塊的指針,並且「分配」操作將增加此內存塊的使用計數。對於我的情況,我應該釋放m_movieName之前分配一個值?如果我沒有釋放它(通過[self.movi​​eName釋放]),上一個塊的何時何地將被釋放? 非常感謝您的幫助!

+0

http://stackoverflow.com/questions/2922196/best-way-to-initialise-clear-a-string-variable-cocoa/2922232#2922232這可以幫助你 – vodkhang 2010-06-06 12:42:25

回答

7

不,你已宣佈你的財產爲retain,這意味着你的對象將保留屬性值。合成的(=編譯器生成的)setter將在分配新值之前處理釋放舊的NSString,所以您不必自己管理它。

當直接訪問屬性的後備存儲(在您的實例中爲m_movieName)時要小心,因爲繞過setter不會自動釋放當前值。

+0

哇,約翰內斯,謝謝快速回答! – 2010-06-06 12:42:10

+0

我必須在系統限制10分鐘後接受你的回答。再次感謝。 – 2010-06-06 12:44:08

+0

@Elliot:Pablo的建議很有價值,但一定要檢查一下(即使它不直接回答你的問題)。 – 2010-06-06 12:46:58

3

首先,我的建議是,如果你使用的是NSString屬性,請使用複製代替保留。檢查this SO問題的細節。

@property(nonatomic, copy) NSString *m_movieName; 
+0

很棒的建議!謝謝巴勃羅! – 2010-06-06 12:49:03

相關問題