4

aのインスタンスですNSString。文字列をリリースしてから印刷すると、アプリがクラッシュするのではないかと思いました。代わりに、割り当てられた適切な値を返しました。私の質問は、オブジェクトを解放した後でも、オブジェクトの値を取得できるかどうかです。そうでない場合、割り当てが解除された後でも、なぜの値を確認できるのaですか?

.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
4

2 に答える 2

3

オブジェクトを解放するということは、呼び出し元がそれを使い果たしたことを意味します。リリース後、オブジェクトにアクセスしようとした結果は未定義です-クラッシュの可能性があり、他の誰かがオブジェクトを保持していて、クラッシュせずに動作する可能性があり、完全に別の何かである可能性があります。

したがって、オブジェクトを解放する場合は、以前に保持(初期化、コピー)したのと同じスコープで後でオブジェクトにアクセスしようとしないでください。

于 2012-08-24T09:03:09.310 に答える
3

@"abc"定数なので、リリースされることはありません

違いを感じます:

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

それはメモリのチャンクを参照しているので、メイン出力をクラッシュまたはリリースします

于 2012-08-24T09:29:01.413 に答える