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
有人能解釋一下嗎? 謝謝
謝謝你的回答。我期望它減少到零,因爲這個插圖:http://cocoadevcentral.com/images/articles/000094/learnobjectivec-referencecounting.png 有了這段代碼,我只是試圖展示引用計數如何在抽象點看法;我同意你的觀點,認爲「我擁有這個對象」在應用程序編程的觀點上更好。 – Max 2010-08-13 16:33:52
@Max這是真的,根據「當retainCount達到零時,對象被解除分配」來考慮它,可以很容易地理解正在發生的事情。然而,它的實現方式是「當對象的retainCount爲1,它被釋放時」,因爲不需要將其遞減爲0.這是一個實現優化。 – 2010-08-13 16:45:57
感謝您的澄清 – Max 2010-08-13 20:26:35