NSString alloc / release / retain

时间:2012-08-24 08:54:47

标签: objective-c memory-management

aNSString的一个实例。我想如果我在发布后打印一个字符串,它会使应用程序崩溃。相反,它返回了分配给它的正确值。我的问题是,即使在释放后,我们还能得到一个物体的价值吗?如果没有,为什么我能够看到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

2 个答案:

答案 0 :(得分:3)

释放任何对象意味着调用者完成了它。在发布之后,尝试访问该对象的结果是未定义的 - 可能是崩溃,可能是其他人正在保留该对象并且它可以正常工作而不会崩溃,可能完全不同。

因此,如果您发布了一个对象,则不应该尝试在之前保留(初始化,复制)它的同一范围内访问它。

答案 1 :(得分:3)

@"abc"是常量,因此永远不会被释放

感受到不同之处:

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

它给我崩溃或释放主输出,因为它引用了一些内存