TL; DR要登錄可能會影響結果的方式,你可能會得到登錄時臨時所有權,因此由1
以下的答案必須增加你所有的打印效果,是因爲你的簡化不應該在retainCount
中真正擔心實際價值。
保留計數保持計數給定對象有多少引用(所有者)。 創建時,只有一個所有者,因此保留計數設置爲1.每次對象獲得新的所有者(retain
)時,保留計數都會增加1。每次對象丟失並且所有者(release
)保留計數減1。
請注意,retainCount
永遠不會達到零。如果所有者的數量爲1,並且您失去了所有者,則對象被釋放,則計數不會減少。在斯威夫特
@implementation TestObject
- (instancetype)init {
TestObject *result = [super init];
NSLog(@"Retain count after creation: %@", @(self.retainCount));
return result;
}
- (instancetype)retain {
TestObject *result = [super retain];
NSLog(@"Retain count after retain: %@", @(self.retainCount));
return result;
}
- (oneway void)release {
NSLog(@"Retain count before release: %@", @(self.retainCount));
[super release];
}
- (void)dealloc {
NSLog(@"Retain count before dealloc: %@", @(self.retainCount));
[super dealloc];
}
@end
,並用它來代替你的NSObject
:
爲了更好的測試中,我創建了一個OBJ-C級,不ARC編譯
var foo1: TestObject? = TestObject()
print("#")
print(CFGetRetainCount(foo1))
var foo2 = foo1
print("#")
print(CFGetRetainCount(foo1))
foo2 = nil
print("#")
print(CFGetRetainCount(foo1))
foo1 = nil
,導致:
Retain count after creation: 1
#
Retain count after retain: 2
2
Retain count before release: 2
Retain count after retain: 2
#
Retain count after retain: 3
3
Retain count before release: 3
Retain count before release: 2
#
Retain count after retain: 2
2
Retain count before release: 2
Retain count before release: 1
Retain count before dealloc: 1
這基本上是你所期望的,但有額外的保留和當您將對象傳遞給函數時獲得臨時所有權時,會在每個CFGetRetainCount
周圍發佈。
這是爲什麼你永遠不應該讀取retainCount
的值的例子之一。它沒有調試值,這在documentation中也有提及。
因爲'foo1','foo2'是常量,所以你的代碼甚至不能編譯*。即使你將它們聲明爲變量,你也不能給它們分配'nil'。你真的測試了什麼? –
我從來不認爲CFGetRetainCount可以告訴我關於對象保留數量的信息。嘗試簡單的代碼:var foo1:NSNumber? = NSNumber(value:0) print(CFGetRetainCount(foo1))。它的打印量非常大 – larva
您正在詢問關於代碼的問題。發佈您所詢問的代碼並不是您現場製作的代碼,這是很平常的禮貌。 – gnasher729