NSObject发布,NSString,NSArray不是吗?

时间:2013-05-09 09:52:47

标签: ios objective-c memory-management

如果我写 -

NSObject *a = [[NSObject alloc] init]; // or UIView or something
[a release];
NSLog(@"a = %@", a); // causes EXC_BAD_ACCESS, fine

但是,如果我写 -

NSArray *a = [[NSArray alloc] init]; // or NSString or NSDictionary
[a release];
NSLog(@"a = %@", a); // no crash, prints empty array or string

为什么第二种情况不会导致访问不良,因为它已被释放?

1 个答案:

答案 0 :(得分:8)

访问已发布的对象不必立即使应用程序崩溃。

请注意,即使您释放了对象,内存也会保留一段时间,内容相同。只有当对象内存已被其他对象覆盖时,才会出现崩溃。请注意,即使使用覆盖的内存,您也不必崩溃。您只能获得一些非常奇怪的行为(例如,当对象是NSString时,它可以获得不同的内容)。

基本上,这种行为完全是随机的。使用已发布的对象可以立即使您的应用程序崩溃,也可以在5分钟或2小时内崩溃。

修改: 感谢 Martin R 提供了一个有趣的评论。似乎由[[NSArray alloc] init]创建的数组,即空的不可变数组,总是返回相同的实例。这意味着您的release将无法取消分配。但是,这种行为很容易改变,编译器或OS版本之间可能会有所不同。