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
答案 0 :(得分:3)
释放任何对象意味着调用者完成了它。在发布之后,尝试访问该对象的结果是未定义的 - 可能是崩溃,可能是其他人正在保留该对象并且它可以正常工作而不会崩溃,可能完全不同。
因此,如果您发布了一个对象,则不应该尝试在之前保留(初始化,复制)它的同一范围内访问它。
答案 1 :(得分:3)
@"abc"
是常量,因此永远不会被释放
感受到不同之处:
a = [[NSString alloc] initWithFormat:@"%d", 123];
它给我崩溃或释放主输出,因为它引用了一些内存