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;
问题:
[p release]后还能继续访问为什么不报错?
看建议是release后最好不要继续访问。 如果能访问,什么情况下会出问题?
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도 수정해야 합니다.
으아아아