搜索

首页  >  问答  >  正文

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

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

@interface person : NSObject

@property int a;

@end

@implementation person

@synthesize a;

- (void) dealloc
{
    NSLog(@"dealloc person");
}

@end

int 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;

问题:

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

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

大家讲道理大家讲道理2757 天前576

全部回复(1)我来回复

  • 天蓬老师

    天蓬老师2017-05-02 09:26:08

    因为 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]; // 一定要有
    }

    回复
    0
  • 取消回复