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 回答