1

たとえば、RootViewControllerクラスとクラスがあり、 fromAnotherViewControllerのプロパティを変更する必要があるとします...「RootViewController」プロパティを(そのインスタンス変数にアクセスできるように) 持つことは安全ですか?RootViewControllerAnotherViewControllerAnotherViewController.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お互いのプロパティとして設定されている場所がいくつかあります)。

これをカバーする参考資料への洞察、またはポインタをありがとう。

4

1 に答える 1

4

より安全な代替手段があるので、私はこれを習慣にすることを避けたいと思います。プロトコル/デリゲートを使用することは、クラス間でデータを管理するためのAppleの推奨される方法です。NSNotificationsを設定して、あるクラスから別のクラスにデータ/イベントを送信/トリガーすることもできます。Key Value Observing(KVO)も、変更をリッスンするための適切な方法です。

MVC構造化では、子ビューとダウンストリームコントローラーは、実際には親のことを知らない(つまり、参照を保持する)必要があります。親が子供を管理および追跡する場合は、常に逆の方法で機能する必要があります。

于 2011-06-30T16:05:51.413 に答える