TL; DR, как вы записываете могут повлиять на результаты, вы можете получить временную собственность при входе, поэтому увеличивая все ваши результаты печати на 1.
следующий ответ является упрощением, потому что вы не должно действительно беспокоиться о реальной стоимости в retainCount
.
Счетчик хранения подсчитывает количество ссылок (владельцев) данного объекта. Когда создано, существует ровно один владелец, поэтому счетчик удержания устанавливается равным 1. Каждый раз, когда объект получает нового владельца (retain
), счет сохранения увеличивается на единицу. Каждый раз, когда объект проигрывает и владелец (release
), количество удержаний уменьшается на единицу.
Обратите внимание, что retainCount
никогда не может достигнуть нуля. Если количество владельцев - 1, и вы теряете владельца, объект освобождается, тогда счетчик не уменьшается.
Для лучшего теста, я создал класс Obj-C, составленный без АРК:
@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
и использовал его в Swift вместо вашего NSObject
:
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 (значение: 0) print (CFGetRetainCount (foo1)). Очень много печати. – larva
. Вы задаете вопрос о коде. Было бы обычной вежливостью размещать код, о котором вы просите, а не что-то, что вы только что создали на месте. – gnasher729