objective-c - Ojbect-c对象release后还能访问其变量?

【字号: 日期:2023-12-01浏览:23作者:雯心

问题描述

1、在关闭ARC的情况下,为什么一个Object-c对象主动release后,其成员变量还能继续访问?代码如下:

@interface person : NSObject@property int a;@end@implementation person@synthesize a;- (void) dealloc{ NSLog(@'dealloc person');}@endint main(){ person* p = [[person alloc]init]; p.a = 10; NSLog(@'%d', p.a); //10 [p release]; // dealloc p.a=20; NSLog(@'%d', p.a); //20 return 0;}

问题:在调用[p release];后,还能继续访问p的变量a;

问题:

[p release]后还能继续访问为什么不报错?

看建议是release后最好不要继续访问。 如果能访问,什么情况下会出问题?

问题解答

回答1:

因为 release 后 p 指向的地址仍然没有变,如果操作系统还没有把那一块内存回收,继续访问就不会报错,也就是悬空指针。

p ----------------------------------> Person {a: 10, reference_count: 1}

p -- send release message to --> Person {a: 10, reference_count: 1}

p ----------------------------------> Person {a: 10, reference_count: 0} (dealloced)

p --------- get value of a --------> Person {a: 10, reference_count: 0} (a 仍然是 10)

如上述,想让它出问题的话,一直尝试到操作系统让它挂点为止就好了(通常来说很快):

person* p = [[person alloc]init];p.a = 10;NSLog(@'%d', p.a);[p release];do { NSLog(@'%d', p.a);} while (TRUE);

多执行几次可以看到,什么时候挂完全没规律。。。所以不是最好不要继续访问,是绝对不要继续访问。。。

刚才没看到,dealloc 也要修改:

- (void) dealloc{ NSLog(@'dealloc person');[super dealloc]; // 一定要有}

相关文章: