Является ли плохой идеей установить UIViewController как свойство другого UIViewController?

Например, скажем, у меня есть RootViewController класс и AnotherViewController класс, и мне нужно изменить свойство в моем RootViewController от AnotherViewController... безопасно ли иметь свойство RootViewController в AnotherViewController.h (чтобы я мог получить доступ к его переменным экземпляра)?

@interface AnotherViewController : UIViewController {
    RootViewController *rootViewController;
}

@property (nonatomic, retain) RootViewController *rootViewController;
@end

@implementation AnotherViewController

@synthesize rootViewController;

- (void)someMethod {
    // set the data was added flag, so the rootViewController knows to scroll to the bottom of the tableView to show the new data
    self.rootViewController.dataWasAdded = YES;

    // if the user came in via a search result, make the search controller's tableView go away
    self.rootViewController.searchDisplayController.active = NO;
}

Если это не очень хорошая идея, кто-нибудь может объяснить, почему?

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

Причина, по которой я спрашиваю, заключается в том, что я делаю свое приложение универсальным и использую UISplitViewController Я заметил, что мне нужно часто обновлять "основной вид", когда пользователь вносит изменения в "подробный вид". Итак, я взял то, что казалось легким маршрутом и начал настройку UIViewControllers как свойства... но я испытываю некоторые трудно отследить утечки памяти и случайные сбои. Я читаю что-то о "циклических ссылках" и задаюсь вопросом, может ли это быть частью проблемы (у меня есть пара мест, где UIViewControllers устанавливаются как свойства друг друга).

Спасибо за понимание или ссылки на справочные материалы, которые охватывают это.

1 ответ

Решение

Я бы не стал делать это привычкой, так как есть более безопасные альтернативы. Использование протокола / делегата является предпочтительным способом Apple для управления данными в разных классах. Вы также можете настроить NSNotifications для отправки / запуска данных / событий из одного класса в другой. Наблюдение за ключевыми значениями (KVO) также является достойным способом выслушать изменения.

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

Другие вопросы по тегам