2011-06-06 16 views
0

我在Objective-C上玩了一點我的linux。其實我正在努力學習它,並且在研究這個任務時,我陷入了困境。Objective-C - 破壞對象後指針不爲零

下面是代碼:

#import <stdio.h> 
#import <Foundation/NSObject.h> 


int main(void) { 

    NSObject *a = [[NSObject alloc] init]; 

    printf("Class retain count: %i\n", [a retainCount]); 
    printf("Is pointer nil: %i\n\n", (a==nil)); 

    [a retain]; 

    printf("Class retain count: %i\n", [a retainCount]); 
    printf("Is pointer nil: %i\n\n", (a==nil)); 

    [a release]; 

    printf("Class retain count: %i\n", [a retainCount]); 
    printf("Is pointer nil: %i\n\n", (a==nil)); 

    [a release]; 

    //printf("Class retain count: %i\n", [a retainCount]); 
    printf("Is pointer nil: %i\n", (a==nil)); 


    return 0; 
} 

而這是輸出:

類保留計數:1

是指針零:0

類保留計數: 2

指針ni 1:0

類保留計數:1

是指針爲零:0

是指針爲零:0

我註釋掉最後的printf,因爲它導致程序崩潰(我得到「分割故障OBJ /測試」原因一個沒有設置爲零...)。那麼我做錯了什麼?爲什麼不將指針設置爲零?它只是保持它的舊值(在刪除對象之前)...

+1

** retainCount **沒用。別叫它。 – bbum 2011-06-06 15:19:33

+0

@bbum:你能解釋一下爲什麼? – xx77aBs 2011-06-06 17:40:42

+1

對象的保留計數是一個通常沒有意義的內部實現細節(嘗試'[@「foo」retainCount]')。 http://stackoverflow.com/questions/4636146/when-to-use-retaincount – bbum 2011-06-06 22:25:50

回答

3

釋放對象不會將其設置爲零。 release將釋放由您的變量指向的對象(在這種情況下a),但是你的變量仍然指向同一個對象的內存地址,除非你指定喜歡的其他地址:

a = otherAddress; 

通常你會做什麼:

a = nil; //or 
a = [[NSObject alloc] init]; //or 
a = [MyObject objectWithSomething:smthg]; 

因此,如果您打算在重新分配後重新使用a,那麼在完成後將其設置爲零。如果您嘗試使用a,並且它指向一個釋放對象,請避免出現「分段錯誤」錯誤。

+0

那麼,當你在'_deallocated_'之後重用'a'時,你會得到一個錯誤,在它被釋放後沒有必要。 – 2011-06-06 13:16:27

+1

@Jonathan Sterling:好吧,當你在釋放*之後重用'a'並且將內存用於其他內容*時,你會得到一個錯誤,而不一定是在它被釋放和重用之後。 – 2011-06-06 13:21:17

+0

@Nikolai更好,謝謝你指出。 – 2011-06-06 16:18:33

3

爲什麼不將指針設置爲零?

因爲指向Objective-C對象的指針只是指針。當你在plain C中使用free內存時,你不會期望你的指針被設置爲NULL。

2

指針不會變爲nil,除非您將nil指定給它。指針無效不是表示它將是nil。您必須像任意整數一樣考慮指針:如果將其設置爲某個數字,它將繼續保留該值,直到您設置爲止。

這就是爲什麼您不能使用obj == nil來檢查對象是否仍然有效。

2

發佈後您必須明確地set the variablenil

[a release]; 
//This below line say : i don't have need to use the variable anymore. 
a = nil ; 

,如果你沒有任何用處的可變然後第一release,並設置與nil值。 (需要設置nil)。