2011-02-04 56 views
0

大家好,我有在理解以下example.i保留了概念的問題了解的挽留......但在這裏混淆..內存問題,此代碼

我有2類視圖1和視圖2

使用
here is method of View1 

-(IBAction)callingView2 
{ 
    view2 *view=[[view2 alloc] init]; 
    [self.navigationController pushViewController:view animated:YES]; 

    NSString *ss=[[NSString alloc]initWithString:@"Hi friend"]; 
    [view callingToRetain:ss]; 
    [ss release]; 
    [view release]; 

} 

,並在視圖2我有2種方法和str是一個字符串(未分配)

-(void)callingToRetain:(NSString*)s 
{ 
    //[s retain]; //it is not effecting my program 
    str = s; 
} 

//And then printing it on a button click after reaching to view2 
-(IBAction)print 
{ 
    NSLog(@"string = %@",str); 
} 

規則說我應該保留的字符串,如果我有以後使用它,但在這裏它的工作無保留.....

我的東西,這是由於str = s;,因爲它保留了MAX_VALUE,但我不知道......

如果是這樣的問題,那麼它的效果的內存泄漏的概念?

有什麼建議嗎?

回答

5

規則只說,你需要的,如果以後需要使用對象保留。

它確實不是說如果你不能正確保留,它肯定會崩潰。

大多數情況下,不保留正確導致崩潰遲早的事。但是你的代碼是一個例外,因爲你使用的字符串只是一個在編譯時已知的常量字符串。

這是怎麼回事。假設你執行以下操作:

NSString* [email protected]"foo"; 
NSString* ss=[[NSString alloc] initWithString:@"foo"]; 

這實際上使得ss等於s。作爲一個優化,Cocoa運行時確實不是創建一個單獨的NSString實例。 而這個對象s是一個編譯時NSString,它有效地表現得像一個無限保留的對象。

這就是爲什麼你的代碼沒有崩潰。但是,Apple可以在下一個版本的操作系統中更改Cocoa運行時實現,以便您的代碼崩潰。

的一點是,你應該遵循的規則。如果遵循該規則,即使在未來版本的操作系統中也不會崩潰。如果沒有,它可能不會立即引發崩潰,但它最終會。

+0

+1感謝您的視圖...我也想知道,可以無限-保留對象造成內存泄漏?......我的意思是存儲區域把它分配給什麼,什麼時候釋放? – Saawan 2011-02-04 05:32:54

1

即使它的工作沒有retain,你應該使用它(或更好的,copy它)。那是rule。這並不意味着它將在未來或其他呼叫中起作用。

另外,不要忘了releasedealloc

+0

+1感謝ANS – Saawan 2011-02-04 05:36:45