NSObject发布,NSString,NSArray不是吗?

use*_*227 5 memory-management objective-c ios

如果我写 -

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

但是,如果我写 -

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

为什么第二种情况不会导致访问不良,因为它已经发布了?

Sul*_*han 8

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

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

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

编辑: 感谢Martin R的一个有趣的评论.似乎由[[NSArray alloc] init]空的不可变数组创建的数组总是返回相同的实例.这意味着你release不会让它被解除分配.但是,这种行为很容易改变,编译器或OS版本之间可能会有所不同.

  • 不同之处在于,在第二种情况下,您将得到一个根本没有解除分配的共享实例,比较http://stackoverflow.com/questions/16323908/why-variable-with-weak-qualifier-retains-an-object/16324350 #16324350. (6认同)