2012-10-02 130 views
0

可能有人請告訴我內存mgmt是需要的或stringWithFormat是autoreleased。我查看了Apple開發者網站上的NSString類參考文檔,但是如果返回字符串副本,或者'msg'僅指向自動釋放字符串的指針,則不會看到任何說明。NSString stringWithFormat和Memory Mgmt

NSString *msg; //pointer declared in interface 

- (id) init 
{ 
    //some initialization code.. 
    //is 'msg' receiving a copy or just a pointer assign 
    msg = [NSString stringWithFormat: @"%@ %@", FName, LName]; 
} 

- (void) dealloc 
{ 
    //release some vars, properties here.. 

    [msg release]; //is this correct ????  
    //Or should I be only doing: msg = nil; 

    [super dealloc]; 
} 
+0

如果你是Objective-C的新手,你應該使用ARC。 – bbum

+0

@bbum我不同意某些觀點,我認爲如果他沒有ARC就開始他會更好地理解。除了CF對象還必須是CFRetain和CFReleased,所以最好從一開始就理解這個概念。 –

+0

希望對CF * APIs的暴露應該是最小的。而在使用CF時,沒有合謀的autorelease poole,因此該模式與NS不同(並且更直截了當)。 – bbum

回答

1

好第一個問題是,你的聲明伊娃

NSString *msg; 

將失去其價值,因爲[NSSTring stringWithFormat]根據可可內存規則將返回一個autoreleased對象。該規則規定,任何包含alloc,new或copy的方法名都將返回一個擁有對象,即具有retain計數爲1的對象,這意味着接收方將擁有該對象,其他方法將返回一個自動釋放對象。在你的情況,如果你這樣做,而不是:

msg = [[NSString stringWithFormat: @"%@ %@", FName, LName] retain]; 

現在你自己的對象,您可以在dealloc中發送一個釋放消息

你應該只發送釋放你自己的對象是你送的對象保留或複製消息,在這種情況下,因爲您收到了autorelease對象,並且您沒有發送保留消息或複製消息,因此您不得向其發送釋放消息。發送釋放消息將導致崩潰,因爲msg將在該點處指向垃圾。

+0

謝謝。我是來自C++/C#世界的Obj-C的新手。還有一個問題,那麼initWith的方法呢...我認爲這些不是自動釋放的。你能否爲我澄清一下。 – badboy11

+0

@ badboy11不客氣,initWith方法只是可選地初始化ivars並返回實例,換句話說,它們是構造函數。但是因爲它們是在一個實例上調用的,所以你必須使用[[MyClass alloc] init],alloc意味着你將擁有該對象,因此返回的實例的保留計數爲1。 –

1

如果您使用的是ARC,那麼在這種情況下根本不需要做任何事情。 ARC會爲你處理。如果你不使用ARC,那麼你的代碼可能會崩潰,因爲msg變量會在運行循環結束時自動釋放。

在非ARC情況下,你應該使用:

msg = [[NSString stringWithFormat: @"%@ %@", FName, LName] retain]; 

- (void) dealloc 
{ 
    [msg release]; 
    msg = nil; 
    ... 

或者更好,使用屬性。

相關問題