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

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 --------> 人の値を取得します (a は 10 のままです)

;

上で述べたように、問題を引き起こしたい場合は、オペレーティング システムが停止するまで (通常はすぐに) 試し続けてください:

リーリー

数回実行すると、ハングしたときにパターンがまったくないことがわかります。 。 。したがって、訪問を続けない方が良いというわけではありませんが、訪問を続けないのは間違いありません。 。 。


今は見えませんでしたが、dealloc も変更する必要があります:

リーリー
いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート