2010-08-13 27 views
2

我創建了一個簡單的程序來測試Objective-C內存管理中的保留/釋放方法。據我瞭解的ObjC內存管理,我期望保留計數= 1的對象,我呼籲版本獲取保留計數遞減爲零,然後釋放。但是這個測試程序顯示,第一個版本後,我仍然得到保留計數= 1:在obj上使用retainCount = 1做[obj release]不會將retainCount遞減爲零

// TestClass.h 
#import <Cocoa/Cocoa.h> 
@interface TestClass : NSObject { 
} 
@end 

// TestClass.m 
#import "TestClass.h" 
@implementation TestClass 
@end 

// RetainRelease.m 
#import <Foundation/Foundation.h> 
#include "TestClass.h" 

void dumpRetain(id o); 

int main (int argc, const char * argv[]) { 
    TestClass *s = [[TestClass alloc] init]; 
    dumpRetain(s); 

    [s release]; 
    dumpRetain(s); 
} 

輸出:

2010-08-13 17:42:45.489 RetainRelease[20933:a0f] NSString - retain count=1 
2010-08-13 17:42:45.491 RetainRelease[20933:a0f] NSString - retain count=1 

有人能解釋一下嗎? 謝謝

回答

8

爲什麼要減少到零?當release保留計數爲1的對象時,該對象被銷燬,因此它不再有保留計數。因此,爲什麼在幾納秒之後將某些東西改爲零?

另外,不要用retainCount來考慮東西。你會因挫折而失敗。相反,想一想「我是否擁有這個東西?如果我這樣做,我完成後是否妥善放棄了這個東西的所有權?」

如果你能正確回答這些問題,那麼這就是你需要做的。

+0

謝謝你的回答。我期望它減少到零,因爲這個插圖:http://cocoadevcentral.com/images/articles/000094/learnobjectivec-referencecounting.png 有了這段代碼,我只是試圖展示引用計數如何在抽象點看法;我同意你的觀點,認爲「我擁有這個對象」在應用程序編程的觀點上更好。 – Max 2010-08-13 16:33:52

+3

@Max這是真的,根據「當retainCount達到零時,對象被解除分配」來考慮它,可以很容易地理解正在發生的事情。然而,它的實現方式是「當對象的retainCount爲1,它被釋放時」,因爲不需要將其遞減爲0.這是一個實現優化。 – 2010-08-13 16:45:57

+0

感謝您的澄清 – Max 2010-08-13 20:26:35