0

Если мы .h файл так:ARC переменная экземпляра сохранить релиз

@interface TestViewController : UIViewController { 

    __weak NSObject *object; 
} 

@end 

и методы в .m файл, как это:

- (void)viewDidLoad { 

    [super viewDidLoad]; 
    NSObject *localObject = [[NSObject alloc] init]; 
    NSLog(@"%ld", CFGetRetainCount((__bridge CFTypeRef)localObject)); 
    object = localObject; 
    NSLog(@"%ld", CFGetRetainCount((__bridge CFTypeRef)object)); 
    NSLog(@"%ld", CFGetRetainCount((__bridge CFTypeRef)localObject)); 
} 

Тогда мы получим следующий результат для сохранения счета:

Вопрос: почему счетчик удержания увеличивается до 2 на «объекте», когда он объявлен как переменная экземпляра «__weak», кроме того, остаток «localObject» остается включенным 1. Я думаю, это из-за того, что вставки ARC сохраняются/освобождаются но я не уверен.

+0

Вы можете найти ответ здесь: http://www.stackoverflow.com/a/4636477/1187415 как предложил @Martin R – tanzolone

+1

CFGetRetainCount() является идентичный -retainCount всеми способами, включая бесполезность. – bbum

ответ

4

Прежде всего обычной оговорка: абсолютное значение сохранения графа не говорит вам что-нибудь полезным, для получения дополнительной информации см

Теперь в вашем случае , в строке

NSLog(@"%ld", CFGetRetainCount((__bridge CFTypeRef)object)); 

прочитать значение слабого указателя, и Clang/ARC documentation 4.2 Semantics состояния о том, что:

Для __weak объектов, текущий pointee удерживается, а затем выпустил в конце текущего полного выражения.

Таким образом, количество удержаний объекта увеличивается на единицу при переходе на CFGetRetainCount(). Вы можете видеть, что и в сгенерированном коде сборки:

movq %rbx, %rdi 
callq _objc_retain 
movq %rax, %rbx 
.loc 1 21 0     
movq %rbx, %rdi 
callq _CFGetRetainCount 
movq %r15, %rdi 
movq %rax, %rsi 
xorb %al, %al 
callq _NSLog 
movq [email protected](%rip), %r12 
movq %rbx, %rdi 
callq *%r12 
Смежные вопросы