Значение переменной экземпляра ARC сохраняется

Если у нас есть файл .h:

@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)); } 

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

1
2
1

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

One Solution collect form web for “Значение переменной экземпляра ARC сохраняется”

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

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

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

вы читаете значение слабого указателя и документацию Clang / ARC 4.2. В семантике говорится об этом:

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

Поэтому счет сохранения объекта увеличивается на единицу при передаче в 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 _objc_release@GOTPCREL(%rip), %r12 movq %rbx, %rdi callq *%r12 
  • iOS - ViewController не освобождается при входе в ARC
  • Как правильно очистить память при создании CGContextRef?
  • Управление памятью, связанное с контекстом void * в какао
  • Безопасная память для быстрых объектов
  • Почему мне не нужно CFRetain () результат ABAddressBookGetPersonWithRecordID () в этом коде
  • VM: CG растровый Память данных продолжает расти
  • Проблемы с табличным представлением и освобожденным экземпляром
  • Блоки в нетривиальных циклах
  • Как освободить блок
  • Ошибка приложения из-за нехватки памяти
  • Что случилось с этим dealloc в ARC?
  • Interesting Posts

    Вычислить максимальный размер шрифта, который подходит для прямоугольника?

    Проведите по экрану, чтобы удалить его в таблицеView, которая находится внутри pageViewController

    Push Notifications iOS и собственный клиентский клиент для клиента

    Можно ли искать близлежащие рестораны и бары через API для iPhone SDK?

    Xcode – дубликат сцены раскадровки

    С NSOperationQueue, как вы добавляете в фоновый режим вместо основного, и как работает контроль количества операций?

    Существуют ли какие-либо ограничения для мобильных приложений Flex 4.5 на iOS?

    viewDidLayoutSubviews проблемы при вращении

    Кордова InAppPurchase: .getProducts () возвращает пустой массив

    UITableViewCell показывает белый фон и не может быть изменен на iOS7

    Возможно ли иметь условное `firedate` для UILocalNotification?

    IPad программирования, любой способ инвертировать цвет программно?

    Получение черного экрана при использовании панели вкладок при поиске с помощью SearchController

    Ошибка Xcode 9: не удается найти cdtool

    Фиксирование ориентации при сшивании (слиянии) видео с использованием AVMutableComposition

    PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.