Плохо ли устанавливать UIViewController как свойство другого UIViewController? - PullRequest
1 голос
/ 30 июня 2011

Например, скажем, у меня есть класс 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 Ответ

4 голосов
/ 30 июня 2011

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

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

...