objective-c - Ojbect-c对象release后还能访问其变量?
大家讲道理
大家讲道理 2017-05-02 09:24:08
0
1
580

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后最好不要继续访问。 如果能访问,什么情况下会出问题?

大家讲道理
大家讲道理

光阴似箭催人老,日月如移越少年。

모든 응답(1)
Peter_Zhu

p가 가리키는 주소는 릴리스 후에도 변경되지 않았기 때문에 운영 체제가 해당 메모리 조각을 회수하지 않은 경우 계속해서 액세스하면 오류가 보고되지 않습니다. 이는 매달린 포인터입니다.


p ---------------------> 사람 {a: 10, reference_count: 1}

p -- 릴리스 메시지 보내기 --> 사람 {a: 10, reference_count: 1}

p ---------------------> 사람 {a: 10, reference_count: 0} (할당 해제됨)

p --------- a의 값 가져오기 --------> Person {a: 10, reference_count: 0}(a는 여전히 10)


위에서 언급한 것처럼 문제가 발생하도록 하려면 운영 체제가 중단될 때까지(대개 매우 빠르게) 계속 시도하세요.

으아아아

몇번 실행해 보면 멈춤 현상이 전혀 발생하지 않는 것을 볼 수 있습니다. . . 그러므로 계속 방문하지 않는 것이 가장 좋은 것은 아니며, 계속 방문하지 않는 것이 좋습니다. . .


지금은 못 봤는데, dealloc도 수정해야 합니다.

으아아아
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿