5

如果我写——

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

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

4

1 回答 1

8

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

请注意,即使您释放对象,内存也会在那里停留一段时间,内容相同。仅当对象内存已被其他对象覆盖时,您才会崩溃。请注意,即使内存被覆盖,您也不必崩溃。你只能得到一些非常奇怪的行为(例如,当对象是 a 时NSString,它可以得到不同的内容)。

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

编辑: 感谢Martin R的有趣评论。似乎由 创建的数组[[NSArray alloc] init],即空的不可变数组,总是返回相同的实例。这意味着你release不会让它被释放。但是,这种行为很容易改变,在编译器或操作系统版本之间可能会有所不同。

于 2013-05-09T09:56:24.963 回答