Это не неслыханно, но несколько необычно.Основной способ, которым я видел, что он использовал (и использовал его сам), - это когда вы имеете дело с каким-то полусинхронным объектом (под полусинхронным я имею в виду, что он не блокирует основной поток, но также невыполнить в фоновом потоке; NSURLConnection
будет соответствовать этому счету).Например, я написал подкласс NSWindowController
, специально предназначенный для отображения окна в виде листа и для вызова некоторых обратных вызовов делегата.По сути, вы бы alloc
/ init
создали новый контроллер листов и вызвали бы beginSheetForWindow:
.Это будет запускать лист полусинхронно, а затем вызывать соответствующий обратный вызов, когда лист будет отклонен.
Поскольку вызывающий объект не обязательно «владеет» листом (думайте о нем как о версии Mac дляконтроллер модального представления на iOS), контроллер листа делает [self retain]
непосредственно перед показом листа и [self release]
сразу после очистки и вызова обратных вызовов.Цель этого состояла в том, чтобы гарантировать, что объект controller будет держаться до тех пор, пока лист не будет готов.(Лист, IIRC, был сохранен runloop, но мне также нужно было, чтобы контроллер оставался там)
Как я уже говорил, очень редко можно встретить ситуацию, когда вы захотите [self retain]
, ноэто не невозможноОднако, как правило, если вы считаете, что вам нужно [self retain]
, вы можете подумать еще раз.