微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

解决方法

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

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

原文地址:https://www.jb51.cc/iOS/329245.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐