objective-c - Ojbect-c對象release後還能存取其變數?
大家讲道理
大家讲道理 2017-05-02 09:24:08
0
1
507

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

因為 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]; // 一定要有
}
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!