2012-08-24 179 views
4

aNSString的一個實例。我想如果我在發佈之後打印一個字符串,它會使應用程序崩潰。相反,它會返回分配給它的適當值。我的問題是,即使在釋放之後,我們是否應該得到一個物體的價值?如果沒有,爲什麼我能夠看到a的值,即使在它被釋放後?NSString分配/釋放/保留

.H

#import <UIKit/UIKit.h> 

@interface ViewController : UIViewController 
{ 
    NSString *a; 
} 

@end 

的.m

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    a=[[NSString alloc]initWithString:@"abc"]; 

    // Do any additional setup after loading the view, typically from a nib. 
} 

- (void)viewWillAppear:(BOOL)animated 
{ 
    [super viewWillAppear:animated]; 

    NSLog(@"String %@",a); 
    [a release]; 
    NSLog(@"release %@",a); 
    [a retain]; 
    NSLog(@"retain %@",a); 
} 

輸出: -

2012-08-24 14:15:49.501 a[1176:f803] string abc 
2012-08-24 14:15:53.404 a[1176:f803] release abc 
2012-08-24 14:15:55.325 a[1176:f803] retain abc 
+0

我假設a是你的控制器的一個屬性,它是如何定義的? – Asciiom

+0

請參閱我的更新後的qn .. – Nina

+0

您不太確定發佈後您可以訪問該對象。它取決於原始對象的內存何時被覆蓋。當你幸運的時候,你可以在不幸運的應用程序崩潰時訪問該對象。 **在釋放它們後嘗試與任何物體一起使用是高風險** – holex

回答

3

@"abc"是恆定的,所以它永遠不會被釋放

感受到其中的差別:

a = [[NSString alloc] initWithFormat:@"%d", 123]; 

它讓我崩潰或釋放主要輸出,因爲它指的是內存

一些塊
+0

如果我使用'a = [[NSString alloc] initWithFormat:@「%@」,abc];它將會崩潰;其中abc是另一個字符串 – Nina

+0

@holex但它在這裏提到,http://stackoverflow.com/questions/5769769/do-i-need-to-release-a-constant-nsstring,即使在我們釋放NSString實例之後,它仍會保留在內存中,這是不是意味着它是一個常量呢? – Nina

3

釋放任何對象表示該呼叫者是用它完成。在發佈之後,試圖訪問對象的結果是未定義的 - 可能是崩潰,可能是別人保留了對象,並且它沒有崩潰,可能完全是另一回事。

所以,如果你釋放一個對象,你不應該試圖在之前保存(初始化,複製)它的同一範圍內訪問它。

+0

謝謝:)我只是希望看到當我釋放後立即發生並保留下來會發生什麼。我認爲它會崩潰。我也嘗試了一些延遲後打印的值。即使如此,它也顯示出合適的價值。 – Nina

+0

保留/釋放機制就像一個合同,可以確保您在代碼中可以確實執行的某些操作,而不會定義違反合同的後果。 – waldrumpus

+3

另一個例子:[在字符串文字上調用'release'](http://stackoverflow.com/questions/5769769/do-i-need-to-release-a-constant-nsstring)('@「foo」')永遠不會導致它們被刪除。 – waldrumpus