2012-05-08 7 views
2

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

私は間違っていますか?それはモジュールですか?

答えて

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上のスレッド同期で読み上げます。

+0

オブジェクトが予期せずに割り当て解除されないようにするには、オブジェクトが何もしないように 'retain'と' release'をオーバーライドする方が良いでしょう。 – dreamlax

+0

はい、これも破壊できません。 ' - (NSUInteger)retainCount { return NSIntegerMax; } ' –

+0

これは私が探していたものだと思います。それを試して!ありがとう! – arnoapp

0

いくつかのクラス(A)にビュー/ビューコントローラなどで使用できるファイル解析メソッドを含める場合は、Aをアプリケーションデリゲートに追加してAをインスタンス化し、Aインスタンスを再利用しますトラフアプリデリゲートリファレンス。あなたはあなたがシングルトンオブジェクトを作成することができ、すべてのビュー/ビューコントローラ内など

1

をインスタンス化する必要はありません

その方法。オブジェクトのインスタンスが1つしか作成されていない場所。シングルトンオブジェクトをデザインパターンとしてもっと見る。

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

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

1

これは「実装を再利用するにはどうすればよいですか」ということになります。

状態(例:ivars)が必要ない場合は、この方法を使用できます。また、この多型を使用することができることに注意してください。

@interface MONStatelessFileParser 

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

@end 

状態(例えばアイバーズ)が必要とされている場合、あなたはこのアプローチを使用することができ、その後、必要に応じてインスタンスを保持します。多型はまた、適用されます。

@interface MONFileParserWithState 

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

- (MONResource *)openResource; 

@end 

その後、多型を回避することができ、あなたは(NSDocumentのと同様に)ファイルを読み込むための複数の方法を持っていないと、複数の戦略がファイルを開くための必要がない場合。

関連する問題