2

私はいくつかのビューを持つアプリに取り組んでいます。これらのビューとそのビュー コントローラーはすべて、同じメソッドを使用しています (ファイル パーサーです)。したがって、重複を避けるために、ファイル解析メソッドのみを使用して新しいクラスを作成することを考えました。しかし今、私はそれを適切な方法で行う方法がわかりません。どのクラスを選ぶべきですか?Cocoa クラスのサブクラスですか? Foundation フレームワークのメソッドのみを使用していると思います。

それとも私は完全に間違っていて、それはモジュールですか?

4

4 に答える 4

2

iPhone SDK で一般的に使用されるパターンは、共有シングルトン インスタンスを使用することです。この例は、[NSNotificationCenter defaultCenter]またはで確認できます[NSUserDefaults standardUserDefaults]

クラスに静的メソッドを追加することで、このようなパターンを実現できます。

// FileParser.h
+ (FileParser*)sharedParser;

// FileParser.m
+ (FileParser*)sharedParser {
    static FileParser* kSharedParser = nil;
    if(kSharedParser == nil) kSharedParser = [[FileParser alloc] init]; 
    // Note the over-retained object, this is by design. You should never release this object.
    // it will be destroyed when your application is killed.
    return kSharedParser;
}

FileParser.hその後、アプリケーションの任意の場所に をインポートして書き込むことで、共有インスタンスにアクセスできます[[FileParser sharedParser] parseSomething:something];

PS: これはスレッド セーフではありません。必要に応じて、iOS でのスレッド同期について調べてください。

于 2012-05-08T20:47:20.947 に答える
1

これは、「実装を再利用するにはどうすればよいですか?」に帰着します。これはおなじみの問題です。

状態 (ivar など) が必要ない場合は、このアプローチを使用できます。また、これはポリモーフィズムを使用する可能性があることに注意してください。

@interface MONStatelessFileParser

+ (MONResource *)resourceAtURL:(NSURL *)pURL;

@end

状態 (ivar など) が必要な場合は、このアプローチを使用して、必要に応じてインスタンスを保持できます。ポリモーフィズムも適用されます。

@interface MONFileParserWithState

@property (nonatomic, copy, readwrite) NSString * elProperty;

- (MONResource *)openResource;

@end

ファイルを読み取る複数の方法 (NSDocument と同様) がなく、ファイルを開くための複数の方法が必要ない場合は、ポリモーフィズムを回避できます。

于 2012-05-09T01:17:11.647 に答える
1

シングルトン オブジェクトを作成できます。作成されたオブジェクトのインスタンスが 1 つだけ存在する場合。設計パターンとしてシングルトン オブジェクトを詳しく調べます。

また、クラスを作成して、そのクラスのクラス メソッド(+)のみを作成することもできます。これは、クラスにインスタンス変数を格納する必要がない場合、またはそれらのインスタンスが静的であると宣言されている場合にのみ機能します。

シングルトン オブジェクトが最適な方法だと思います。FileParser オブジェクトのインスタンスが 1 つしか生成されないため、哲学は上記の ant の回答と非常に似ています。

于 2012-05-08T20:42:47.217 に答える
0

一部のクラス(A)に、ビュー/ビューコントローラーなどで使用できるfileparseメソッドを含める場合は、Aをアプリデリゲートに追加し、そこでAをインスタンス化し、アプリデリゲート参照を通じてAインスタンスを再利用します.

そうすれば、すべてのビュー/ビューコントローラーなどで A をインスタンス化する必要はありません.

于 2012-05-08T20:37:37.217 に答える