Iphone NSString基础知识说明
可能重复:Iphone NSString基础知识说明,iphone,ios,ios4,nsstring,Iphone,Ios,Ios4,Nsstring,可能重复: 我是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 o
我是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);
}
retainCount
。这会把你弄糊涂,而且没用在objective-c中,init方法不一定返回使用alloc创建的相同对象。它可能释放self,然后返回另一个对象 在
initWithString
的情况下,它很有可能返回@“Hello”常量字符串对象,而不是初始化一个新字符串,因为它更快并且没有负面影响(两个字符串都是不可变的)
正如@Caleb所说,普通的内存管理规则不适用于常量字符串。你不能释放它,它将永远在那里
但所有这些都是未经记录的行为,可能会发生变化。你不能依赖它,你发布的代码是有缺陷的,在发布了一些你不应该尝试访问的东西之后
相反,您应该遵循标准实践,即在处理完对象后,始终应释放对象并将指向该对象的任何指针设置为nil
。如果在释放后将str
设置为nil
,您将看到预期的行为
或者更好,只要打开ARC,忘掉所有这些事情