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