2010-06-22 2 views
4

Управление памятью с делегатами, я понимаю, что я не сохраняю делегатов, я немного не уверен, что делать с делегатом, если представление будет выгружено (через viewDidUnload), а затем воссоздано (через viewDidLoad)?Управление памятью с делегатами?

@property(assign) SomeClass *someDelegate; 

.

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    someDelegate = [[SomeClass alloc] init]; 
    [someDelegate setDelegate:self]; 
} 

-(void)viewDidUnload { 
    [super viewDidUnload]; 
    [self setSomeDelegate:nil]; 
} 

-(void)dealloc { 
[super dealloc]; 
} 

PS: Я мог бы быть на ложном пути, я просто пытаюсь получить мою голову вокруг этого ...

веселит Гэри

+0

Отредактировано для отражения исправлений/комментариев Деканов. – fuzzygoat

ответ

2

Если вы используете назначить для вашей собственности, вы» re не вызывает сохранение объекта.

Это означает, что вы обязательно НЕ должны называть выпуск или автореферат!

Ваша линия в вашем dealloc

[someDelegate release]; 

приведет к сбою в какой-то момент вниз в будущем - вы должны удалить его. Вам не нужно заботиться о назначенных свойствах в методе dealloc.

Ваша линия

[self setSomeDelegate:nil]; 

не будет течь.


Однако, вы, кажется, [[someDelegate alloc] init] в методе viewDidLoad. Это необычно; для делегата нормальным является внешний объект, а не один из них. В вашем случае это не действительно делегат, это всего лишь объект, который что-то делает для вас - вы должны переименовать его и изменить свойство на сохранение (и не забудьте освободить его в dealloc).

В настоящее время, если для вашего свойства установлено значение (назначить), а кто-то другой его устанавливает, вы пропустите свой первоначальный делегат. Если вы используете только делегата внутри этого класса, возможно, это не должно быть свойство вообще? Если вы просто хотите, чтобы иметь возможность читать из-за пределов вашего класса, вы можете быть в состоянии использовать (только для чтения) вместо правопреемника (и изменить [self setSomeDelegate:nil] к someDelegate=nil;)

Ваша линия viewDidUnload, которая устанавливает делегат к нулю снимает вопрос вы поднимаете в вашем втором комментарии - вы удаляете делегат, так к тому времени, вы получите viewDidLoad снова, ваш делегат уже ноль :)

+0

Я получаю это, спасибо Дин. Я смущался о том, как работает @property (assign). – fuzzygoat

+0

Итак, учитывая, что у меня есть [[someDelegate alloc] init] в viewDidLoad, что происходит с этим, если просмотр выгружает и снова вызывает viewDidLoad? Каждый раз, когда я вызываю viewDidLoad, я собираюсь получить новый someDelegate и пропустить старый? – fuzzygoat

+0

См. Редактирование, которое я только что сделал :) – deanWombourne

1

This может пролить некоторый свет, чтобы понять, почему

причины что вы избегаете сохранения делегатов, так это то, что вы n ПЕД в избежать сохранить цикл:

А создает BA устанавливает себя в качестве делегата Б ... А выпущен его владельцем

Если B нераспределенной A, A не будет освобожден, а B принадлежит A, таким образом, A dealloc никогда не будет вызван, что вызовет утечку A и B.

Вы не должны беспокоиться о том, чтобы уйти, потому что он владеет B и таким образом получает , избавившись от него в dealloc.

+0

Спасибо Anders, thats очень полезно также ... – fuzzygoat

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