Могу ли я просто выпустить верхний объект (iPhone)? - PullRequest
0 голосов
/ 13 мая 2010

Если я освобождаю объект, который содержит ссылку на переменную, которая мне нужна release, достаточно ли этого? Или я должен release на каждом уровне иерархии сдерживания? Боюсь, что моя логика исходит от слишком долгой работы с сборщиком мусора.

Например, я присвоил этому свойству экземпляра UIPickerView вручную вместо использования IB

@property(nonatomic, assign) id<UIPickerViewDelegate> delegate

Поскольку это свойство assign, я не могу просто release ссылка после того, как я его назначил. Когда я наконец release мой UIPickerView экземпляр, мне нужно сделать это:

[singlePicker.delegate release];
[singlePicker release];

или достаточно второй строки?

Также: Являются ли эти свойства assign нормой или это в основном для Interface Builder? Я думал, что свойства retain были нормальным явлением.

1 Ответ

2 голосов
/ 13 мая 2010

Свойства объявляются assign вместо retain по причине - делегаты не принадлежат их владельцам, и они не вызывают release для них. В противном случае возникла бы проблема с циклическими ссылками. Однако вы должны вызывать release для объекта, который вы используете как делегат, если вы им владеете.

Если делегаты остались, представьте следующую ситуацию:

  • a принимает b в качестве делегата, сохраняет b
  • b принимает a в качестве делегата, сохраняет a

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

Тема рассматривается в Делегирование и рамки приложений Cocoa :

Делегирующие объекты не сохраняют (и не должны) сохранять своих делегатов. Однако клиенты делегирующих объектов (обычно приложений) отвечают за то, чтобы их делегаты были рядом для получения сообщений делегирования. Для этого им, возможно, придется сохранить делегата в управляемом памятью коде. Эта мера предосторожности в равной степени относится к источникам данных, наблюдателям уведомлений и целям сообщений действий. Обратите внимание, что в среде сборки мусора ссылка на делегат является надежной, поскольку проблема с циклом сохранения неприменима.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...