我发现NSString有一个奇怪的行为.我试图运行下面的代码,注意到这一点.
NSString *str = [[NSString alloc] initwithstring : @"hello"]; [str release]; NSLog(@" Print the value : %@",str);
在这里,第三行应用程序应该崩溃,因为我们访问被释放的对象.但它正在打印str的值.没有崩溃但是,随着NSArray我观察到不同的行为.
NSArray *array = [[NSArray alloc] initwithobjects : @"1",@"2",nil]; [array release]; NSLog(@"Print : %@",[array objectatindex : 0]); NSLog(@"Print : %@",[array objectatindex : 0]);
该代码有两个用于NSArray的NSLog语句.在执行第一个NSLog后,释放后就是打印值.但是当执行第二个NSLog时,应用程序崩溃.应用崩溃是可以接受的,因为访问的阵列已经被释放.但是当第一个NSLog被执行时它应该会崩溃.不是第二个.
帮助我这个行为.在这些情况下,发布方式如何.
谢谢
Jithen
解决方法
第一个例子不会崩溃,因为字符串文字从未被释放.代码是真的:
NSString *str = @"hello"; [str release];
人们在内存管理中被字符串文字烧坏,并错误地使用==来比较它们而不是isEqualToString:.编译器会做一些优化,导致误导性的结果.
更新:
以下代码证明了我的观点:
NSString *literal = @"foo"; NSString *second = [NSString stringWithString:literal]; NSString *third = [NSString stringWithString:@"foo"]; // <-- this gives a compiler warning for being redundant NSLog(@"literal = %p",literal); NSLog(@"second = %p",second); NSLog(@"third = %p",third);
2013-02-28 22:03:35.663 SelCast[85617:11303] literal = 0x359c
2013-02-28 22:03:35.666 SelCast[85617:11303] second = 0x359c
2013-02-28 22:03:35.668 SelCast[85617:11303] third = 0x359c
请注意,所有三个变量指向相同的内存.