IOS:NSString的发布不能正常工作

前端之家收集整理的这篇文章主要介绍了IOS:NSString的发布不能正常工作前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我发现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

解决方法@H_301_17@
第一个例子不会崩溃,因为字符串文字从未被释放.代码是真的:
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

请注意,所有三个变量指向相同的内存.

猜你在找的iOS相关文章