1

アプリでThree20 を使用していTTMessageControllerます。私はそれを使用する方法を理解し、他の多くのもの(TTMessageControllerDelegateメソッドとABPeoplePickerNavigationControllerDelegateメソッドを含む)を追加しました。それを理解するのに少し苦労した後、それは私にとってうまくいきます。

私が今抱えている問題は設計上の問題です。同じデリゲート メソッドを含め、2 つの異なる場所でまったく同じように使用したいと考えています。私の現在のアプローチは、すべてのコードを から継承した という単一のクラスに入れ、NSObjectそれComposerProxyを使用する 2 つのコントローラーに次のようにプロキシを使用させることです。

ComposerProxy *proxy = [[ComposerProxy alloc] initWithController:this];
[proxy go];

このgoメソッドは、 を構築しTTMessageController、構成し、 に追加しUINavigationController、提示します。

[self.controller presentModalViewController: navController animated: YES];

ComposerProxyすべてのコードが適切にカプセル化されており、使用したい場所で必要なのは上記の 2 行だけであるため、これはうまく機能します。

ただし、欠点は、クラッシュせずdeallocproxy変数を使用できないことです。私もできませんautorelease。同じ問題です。

私のプロキシアプローチが貧弱なものであるかどうか疑問に思っています。それを使用するクラスで多くの重複コードを必要とせずに、通常、このような一連の動作をカプセル化するにはどうすればよいでしょうか? デリゲート クラスを my に追加し、ComposerProxyコントローラーが架空のメソッドなどでモーダル ビュー コントローラーを閉じる責任を負うようにする必要がありcomposerDidFinishますか?

ティアがいっぱい!

4

1 に答える 1

1

上記の内容から、クラッシュは必ずしも設計が悪いことを示しているわけではありません。メモリ管理の問題でクラッシュしている可能性があります。コントローラーが過剰にリリースされている可能性があります。言うのは難しいです。どのような種類のクラッシュが発生していますか?

現在の設計は問題ないように見えますが、代わりに UIViewControllerにカテゴリを作成することもできます。カテゴリは、モーダル TTMessageController を表示するために必要なすべてのコードを (カテゴリをインポートする UIViewController サブクラスに) 追加し、継承を複製または使用する必要はありません。

@interface UIViewController ( Composer )
// categories can't add instance vars, so return the new controller if you need to store it...
- (TTMessageController *)presentMessageController;
@end

@implementation UIViewController ( Composer )
- (TTMessageController *)presentMessageController {
    // contents of ComposerProxy#go except referring to 'self' instead of 'self.controller'
}
@end
于 2010-04-16T17:01:32.823 に答える