2010-06-08 2 views
2

Я пытаюсь заблокировать свое понимание правильного управления памятью в Objective-C.Объяснение использования `self` во время dealloc?

У меня появилась привычка явно объявлять self.myProperty, а не только myProperty, потому что я встречал случайные сценарии, в которых свойство не было бы настроено на ссылку, которую я намеревался.

Теперь я читаю документацию Apple о выпуске IBOutlets, и они говорят, что все выходы должны быть установлены на nil во время dealloc. Итак, я ставлю это на месте, как следует и опытные аварии в результате:

- (void)dealloc { 
    [self.dataModel close]; 
    [self.dataModel release], self.dataModel = nil; 
    [super dealloc]; 
} 

Итак, я пытался вынимая «я» ссылки, например, так:

- (void)dealloc { 
    [dataModel close]; 
    [dataModel release], dataModel = nil; 
    [super dealloc]; 
} 

Эта вторая система, кажется, работайте, как ожидалось. Тем не менее, он меня немного смущает. Почему бы self вызвать сбой в этом случае, когда я думал, что self был довольно доброкачественной ссылкой, более используемой как формальность, чем что-либо еще? Кроме того, если self не подходит в этом случае, тогда я должен спросить: когда вы должны включить self ссылки, а когда вы не должны?

ответ

1

У меня есть следующее после просмотра образца кода Apple и книг для iphone dev.

набор точек к нулю в «viewDidUnload» (использование SELF аксессору) освободить их в «dealloc» (не SELF)

- (void)viewDidUnload { 
    // Relinquish ownership of anything that can be recreated in viewDidLoad or on demand. 
    // For example: self.myOutlet = nil; 
    self.button = nil 
} 


- (void)dealloc { 
    // no SELF 
    [button release]; // UI objects 
    [images release]; // model objects 
} 
1

[self.dataModel release] опубликует ссылку на dataModel, которой вы не являетесь. Последующий self.dataModel = nil эквивалентен вызову [self setDataModel:nil], и метод setter сам выпустит dataModel, который вы уже сделали.

Простой вещь будет только do self.dataModel = nil.

Как более общий момент, self.blah - не просто вежливый способ доступа к полю. Он вызывает метод и может иметь побочные эффекты. Цель таких побочных эффектов должна заключаться в том, чтобы сделать жизнь более безопасной и легкой. Если вы забудете, что метод вызывается, однако, это может привести к путанице, как здесь.

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

+0

Так что так говорят, что, когда вы синтезировать свойства в верхней части вашего реализации, достаточно просто установить его на ноль в методе dealloc? – bigmac

+1

Не используйте self.dataModel = nil, просто используйте [dataModel release] ;. Установка свойства в ноль через аксессуры может привести к срабатыванию уведомлений. Вы не хотите, чтобы какие-либо уведомления срабатывали во время dealloc, поскольку ваш объект находится в процессе уничтожения. –

Смежные вопросы