будет вызывать срабатывание спускового механизма для освобождения объекта автообновления?

Для следующего

NSImage *image = [[UIImage imageNamed:@"foo.png"] retain]; ... [image release]; 

Я понимаю, что объект, возвращенный из imageName, предположительно будет автореализован. Но так как на объекте сохраняется, а затем явный релиз. Явный релиз не только уменьшит количество ссылок, но также инициирует выпуск целого объекта вместо того, чтобы ждать GC'd позже. Предполагается, что при вызове освобождения iOS сначала попытается уменьшить количество ссылок на объект, а затем выяснить, нет ли другого тела, ссылающегося на объект в то время, поэтому он решает освободить выделенную память. Это правильное понимание и предположение?

В этом нет никакой мусорной коллекции. Это объект, который подсчитывает свои собственные ссылки. Когда объект создается, он дает счетчик ссылок 1. В этом случае метод, который создает объект – imageNamed: – помещает объект в пул автозапуска. Это означает, что пул является владельцем 1 ссылки, и он автоматически выпустит ссылку позже, после завершения этого метода.

Когда счетчик ссылок объекта падает до 0, он уничтожает себя, запустив его метод dealloc .

Ваша передача retain на изображении (который принадлежит пулу автозаполнения) означает, что есть другая ссылка – другой владелец – (тогда счет будет равен 2, но вы действительно не должны думать о внутреннем абсолютном номере объекта, примерно о ваше владение).

Пул по-прежнему будет отправлять release когда он собирается в любом случае, но (если вы еще не выпустили заявку на право собственности, которую вы получили, отправив retain ), этот релиз сам по себе не приведет к возврату ref к 0, поэтому объект не будет уничтожен ,

Поскольку вы отправляете release , вы отказались от своего требования, и пул автозаполнения позаботится о его владении, но еще позже , не так, когда вы отправляете release приводит к уничтожению изображения.

Короче говоря, нет, ваша отправка release не изменяет действие пула авторезистов. Он все еще владеет объектом и по-прежнему отправляет его в конце цикла запуска.

Нет, это неправильно.

Кроме того, вы немного играете с терминами управления памятью, поэтому ваши вопросы немного запутывают.

Подробное обсуждение всех этих аспектов слишком много для должности SO.

Пул автоматического выпуска не является сборкой мусора. Подумайте об этом как о простом наборе объектов. Когда вы автоматически проверяете объект, объект добавляется в пул. Когда пул сливается, он в основном вызывает выпуск на каждом объекте в пуле (следовательно, пул авторекламы имен).

Таким образом, если у вас есть объект, который был автореализован, и вы делаете дополнительный retain вызова (без соответствующего выпуска), пул автозаполнения не освободит объект. Он просто выпустит его один раз, как и предполагалось.

Если вы держите другие ссылки на объект, объект будет по-прежнему жить в прошлом пуле автоопределений.

Вызов сохранения / освобождения несколько раз просто увеличивает и уменьшает счетчик. Объект не отменяет, пока счет не достигнет нуля.

Это неверное предположение. release концептуально отрицает retain . Однако вы не можете знать о каких-либо других подсчетах, которые могли бы плавать вокруг. Если ваше retain является единственным, то оно будет немедленно уничтожено. Это, конечно, не так.

Поскольку мы знаем, что получаем автореализованный объект, мы знаем, что наша ссылка на retain не является единственной. Исходная ссылка от источника авторекламы останется до тех пор, пока текущий пул авторезистов не будет слит. Таким образом, ваше предположение испорчено здесь:

когда вызывается освобождение, iOS сначала попытается уменьшить количество ссылок на объект, а затем выяснить, нет ли другого тела, ссылающегося на объект в то время, поэтому он решает освободить выделенную память.

… потому что ссылка с оригинальной авторекламы останется.

Вообще говоря, вы не должны делать никаких предположений о том, когда именно объект будет удален. Просто волнуйтесь о балансировании собственных накоплений и уверенности в том, что все будет работать. В этом примере также вероятно, что существует гораздо больше ссылок, чем просто ваше собственное retain и предполагаемая autorelease . Рамки могут сохранять и освобождать все, что захотят, за кулисами, пока все остается сбалансированным.

Наконец, просто используйте ARC и забудьте обо всем этом 🙂

  • Как правильно освободить Tabbarcontroller из памяти после выхода из системы
  • Еще один вопрос - «Непризнанный селектор отправлен на экземпляр»
  • iOS - Почему мой NSURL не сохраняется в методе init?
  • Что касается UITabBarController, есть ли способ принудительно отобразить представление при выборе новой вкладки
  • Кто-нибудь успешно использует CFAllocatorSetDefault в приложении для iPhone?
  • Должен ли я сохранять / освобождать значения, взятые из NSDictionary?
  • Ваша идиома, чтобы избежать предупреждений о «потенциальной утечке» с «отдаленными» выпусками?
  • Является ли это хорошей идеей сохранения самообъекта с распределением
  • Отпустите UIViewController, если доступно
  • iOS - должен ли скрытый UIImageView UITableViewCell не иметь назначенное изображение, пока оно не будет видимым?
  • Управление памятью с контролем состояния UINavigationController
  • Interesting Posts
    Давайте будем гением компьютера.