NSString基础澄清

时间:2011-12-30 07:23:29

标签: iphone ios ios4 nsstring

  

可能重复:
  NSString retain Count

我是iPhone编程的初学者。我正在处理NSString。我在下面解释了一个疑问。

@implementation Sample;

NSString *str;

-(void)viewDidLoad
{
    str = [[NSString alloc] initWithString:@"Hello"];

    // Why retain count is some random value? (Eg.2147234)
    NSLog(@"retain count of string %d",[str retainCount]);

    [str release];
}

-(void)printString
{
    // Why the value for "str" getting printed here,
    // though its released in viewDidLoad?
    NSLog(@"string is %@",str);
}

2 个答案:

答案 0 :(得分:3)

  1. 不要看retainCount。这会让你感到困惑,但也无济于事。

  2. 常量字符串内置于代码中 - 它们永远不会被分配或释放。您可以像保留其他任何对象一样保留和释放它们,但不要期望在任何时候释放常量字符串。

答案 1 :(得分:0)

在objective-c中,init方法不一定返回使用alloc创建的同一对象。它可能会释放self然后返回另一个对象。

initWithString的情况下,它很有可能返回@“Hello”常量字符串对象,而不是初始化一个新字符串,因为它更快并且没有负面的副作用(两个字符串都是不可变的)。

正如@Caleb所说,正常的内存管理规则不适用于常量字符串。你无法释放它,它将永远存在。

但所有这些都是无证件的行为并且可能会发生变化。您不能依赖它,并且发布的代码错误,在发布了您不应尝试访问它的内容之后。

相反,你应该遵循标准做法,它说你应该总是释放一个对象,并在你完成它之后设置指向nil的任何指针。如果您在发布后将str设置为nil,则会看到预期的行为。

甚至更好,只需打开ARC,忘记所有这些事情。