可能重复:
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);
}
答案 0 :(得分:3)
不要看retainCount
。这会让你感到困惑,但也无济于事。
常量字符串内置于代码中 - 它们永远不会被分配或释放。您可以像保留其他任何对象一样保留和释放它们,但不要期望在任何时候释放常量字符串。
答案 1 :(得分:0)
在objective-c中,init方法不一定返回使用alloc创建的同一对象。它可能会释放self然后返回另一个对象。
在initWithString
的情况下,它很有可能返回@“Hello”常量字符串对象,而不是初始化一个新字符串,因为它更快并且没有负面的副作用(两个字符串都是不可变的)。
正如@Caleb所说,正常的内存管理规则不适用于常量字符串。你无法释放它,它将永远存在。
但所有这些都是无证件的行为并且可能会发生变化。您不能依赖它,并且发布的代码错误,在发布了您不应尝试访问它的内容之后。
相反,你应该遵循标准做法,它说你应该总是释放一个对象,并在你完成它之后设置指向nil
的任何指针。如果您在发布后将str
设置为nil
,则会看到预期的行为。
甚至更好,只需打开ARC,忘记所有这些事情。