2009-05-01 10 views
3

私はUIViewController(UINavigationControllerではなく)を手動で作成し、そのコントローラのビューをサブビューとして追加するメインビューを持っています。removeFromSuperviewでビューが削除されたときにUIViewControllerを解放する

サブビューは[self removeFromSuperview]を介して自身を閉じます。私は、これは良いですが、しかし、私は今も、UIViewControllerを取り除きたいビューを解放することを理解しています。メモリを解放し、メインビューコントローラがdealloc'ed 。

removeFromSuperviewの使用を避け、メインビューコントローラを逆参照して、サブビューを閉じてコントローラを解放することができますが、よりクリーンな方法が必要なように感じられます。

これを達成するための確立されたベストプラクティスはありますか?

答えて

5

正しい方法は、サブコントローラがメインコントローラにそれを削除するように依頼することです。あなたは二つのコントローラ間の結合を低減したい場合は、あなたのサブコントローラのためのデリゲートプロトコルを作成します。

// This forward declaration avoids having a circular dependency 
// between MySubcontroller and MySubcontrollerDelegate 
@class MySubcontroller; 

@protocol MySubcontrollerDelegate 

- (void)hideMySubcontroller:(MySubcontroller*)subcontroller; 

@end 

をサブコントローラがsupercontrollerに通信するために必要なその他の情報があれば、これは、関連する追加するには絶好の場所でありますコール。すぐに行う必要はないかもしれませんが、あなたのアプリの将来のバージョンでは注意してください。

は、次にサブコントローラにdelegateプロパティを追加します。その代わり、そのビューにremoveFromSuperviewを呼び出すので

@interface MySubcontroller : UIViewController { 
    id <MySubcontrollerDelegate> delegate; 
    ... 
} 
@property (assign) id <MySubcontrollerDelegate> delegate; 
... 
@end 

、サブコントローラは、引数としてselfを渡し、そのデリゲートにhideMySubcontroller:を呼び出す必要があります。

あなたのメインコントローラが、それはデリゲートプロトコルを実装することを宣言する必要があります。

@interface MyMainController : UIViewController <MySubcontrollerDelegate> 
... 
@end 

メインコントローラは、サブコントローラを作成すると、それはselfにサブコントローラのdelegateプロパティを設定する必要があります。サブコントローラのビューを削除し、サブコントローラの割り当てを解除し、必要なものを実行するhideMySubcontroller:メソッドを実装する必要があります。

デリゲートプロトコルを使用することは、サブコントローラがどの種類のオブジェクトを使用するかを知る必要がないことを意味します。そのようなオブジェクトがどこかにあることを知っているだけで、デリゲートプロトコルに準拠します。したがって、2つのコントローラ間の結合は可能な限り小さく保たれる。

ところで、もしあなたがそれを管理できるなら、それをもう一度使用する必要がある場合に備えて、サブコントローラーを周りに置いておくのが実際的です。それはそれを再作成するのにかかる処理時間を節約するでしょう。 (ただし、メモリの警告が表示された場合は、リリースする必要があります)

関連する問題