Мне кажется, я понял, в чем проблема. Apple рекомендует сохранять объекты, к которым вы подключаетесь, через IBOutlet
s (в данном случае ваше изображение). Вы сказали, что не сделали этого, но должен следовать рекомендации Apple. Причина, по которой вам следует это изложить, описана в сообщении на форуме iphonedevsdk.com об этой проблеме, которое ссылается на сообщение в блоге Big Nerd Ranch , в котором все это изложено.
В iOS механизм загрузки пера использует сеттер, если он есть в вашей розетке, но в противном случае он использует кодирование значения ключа; в частности, он использует setValue:forKey:
, который сохраняет значение (это задокументировано, но несколько неожиданно). Ваше представление изображения, являющееся подпредставлением вида сверху вашего контроллера представления, сохраняется этим представлением. Это также сохраняется этой процедурой установки значения ключа. Таким образом, без вашего ведома, ваши объекты имеют две ссылки на представление изображения. Apple делает предложение о сохранении собственности, чтобы вам стало известно, что представление сохраняется.
Вам по-прежнему не следует беспокоиться о количестве сохраняемых данных как таковом, но вы должны сделать одно из двух: сделать это IBOutlet
сохраненным свойством и освободить его в и viewDidUnload
и dealloc
(хотя бы по одному разу!) Или следуйте предложению BNR и сделайте свойство явно назначенным:
@property (assign, nonatomic) IBOutlet UIImageView *background;
В этом случае вам не нужно выпускать его самостоятельно. В обоих случаях убедитесь, что у вас @synthesize
права доступа к свойству.
Ранее:
Не смотрите на счет удержания , и если утечки не обнаружено, не беспокойтесь об этом. Платформа UIKit, вероятно, сохраняет представление по причинам, к которым вы не причастны.
Кроме того, если background
не является сохраняемым свойством:
@property (retain) IBOutlet UIImageView *background;
и вы создаете его в xib, вы не должны выпускать его вообще , потому что вы не являетесь его владельцем. То есть вы не несете ответственности за его память ; Действия, которые возлагают на вас эту ответственность: вызов retain
объекта или его создание с использованием метода, имя которого начинается с alloc
, copy
, mutableCopy
или new
.
.