Какое лучшее место для установки View Controller ivar? - PullRequest
2 голосов
/ 17 июня 2009

У меня есть класс для чтения XML, который я инициализирую с помощью URL

- (id)initWithURL:(NSURL *)url

Этот класс добавляет объекты в массив в вызывающем классе, используя переменную экземпляра

// in the interface
ViewController *viewController;
// in the implementation
[viewController addObject:theObject];

Теперь я инициализирую свой класс чтения XML, а затем устанавливаю View Controller отдельно:

XMLController *xmlController = [[XMLController alloc]
                    initWithURL:url];
xmlController.viewController = self;

Мой вопрос заключается в том, должен ли я создать новую функцию инициализации, которая одновременно устанавливает viewController. Благодаря.

Редактировать: Я забыл добавить, что мой читатель XML начинает загружать и анализировать класс в функции init.

Ответы [ 2 ]

4 голосов
/ 17 июня 2009

Это полностью зависит от вас. Вы можете увидеть примеры обоих стилей по всему коду Apple.

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

Кстати, вы можете подумать о реорганизации логики addObject: в протокол, вместо того, чтобы требовать определенного подкласса. Что-то вроде:

-xmlController:didDecodeObject:

Или то, что имеет смысл для логики вашего объекта XMLController.

2 голосов
/ 17 июня 2009

Если ваша процедура инициализации будет вызывать вызовы делегата / контроллера или запускать асинхронные действия (возможно, включая загрузку), которые могут сообщать делегату, то вы должны включить ее в функцию init.

В противном случае ваш контроллер может пропустить потенциальные сообщения делегата, такие как xmlController: didStartConnection, которые могут быть вызваны до возврата вашей процедуры initWithURL.

Кроме того, если контроллер / делегат является обязательной частью действий XMLController, то вы должны включить его в свою процедуру инициализации.

Так что да, в этом случае я бы предложил:

XMLController *xmlController = [[XMLController alloc] initWithURL:url andController:self];
...