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

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

相关文章

UITabBarController 是 iOS 中用于管理和显示选项卡界面的一...
UITableView的重用机制避免了频繁创建和销毁单元格的开销,使...
Objective-C中,类的实例变量(instance variables)和属性(...
从内存管理的角度来看,block可以作为方法的传入参数是因为b...
WKWebView 是 iOS 开发中用于显示网页内容的组件,它是在 iO...
OC中常用的多线程编程技术: 1. NSThread NSThread是Objecti...