2009-07-24 4 views
3

上の他のオブジェクトを返します。は、私はあなたがいつものようにObjective-Cのオブジェクトを初期化する必要がある多くの場所で読んだのinit

今、私はこのような何かをしようとしている、と私は保持・放出がどのように動作するかを、私は右のそれを持っている場合、向かい合っわからない:

- (id) init:(int)idx { 
    id obj = [Cache findSelf:idx]; 
    if (obj) { 
     [self release]; 
     self = [obj retain]; 
    } else { 
     self = [self doLoad]; 
    } 
    return self; 
} 

私は主によそれがselfobjの保持と解放を行う正しい方法であるかどうか不思議です。より良い方法がありますか?

答えて

7

一部のCocoaクラスは実際に割り当てられたオブジェクトとは異なるオブジェクトを返すので、self = [super init]の部分は正しいと思います。しかし、これはルールではなく例外です。あなた自身のコードで行うことは、非常にまれであるか、まったく行われてはいけません。 -initコールを傍受したくなるかもしれませんが、確立された大会と、Objective-Cプログラマーがコードで期待することに反するでしょう。

このタイプの-initメソッドは、一般的には悪いアプローチです。-initメソッドはできるだけ簡単でなければならず、実際にオブジェクトの初期化に関わる必要があります。

+ (id) instanceForIndex:(NSUInteger)index { 
    id obj = [Cache findSelf:index]; 
    if (obj == nil) { 
     obj = [[self alloc] init]; 
     // Add to cache 
    } 
    return [[object retain] autorelease]; 
} 

が、代わりに-init、このメソッドを呼び出す:私はおそらく、このような便利なメソッドを記述します。これにより、-initロジックがよりクリーンになります。

また、あなたのCacheクラスが何をしているのかよく分かりませんが、その実装を再考する価値があります。また、インスタンスを格納する隠し静的変数を使用することもできます(たとえば、NSMutableDictionaryインデックス)。 This SO questionを使用することができます。

+0

実際、私のキャッシュは静的な変数ですが、ここに見られるように単純ではありません。オブジェクト自体が抽象クラスであり、複数のアイテムが同じインデックスを持つことができるので、実際には、オブジェクトとインデックスの両方を比較して正しいオブジェクトを見つけるオブジェクト自体を渡しています。各サブクラスごとに別々のリストがあります –

+0

クラスクラスタは、この規約を破るよい理由です。 – griotspeak

1

私はQuinnに、便利なクラスメソッドを使用することに同意します。それでも、あなたのelse句では、親初期設定子(self = [super init])を呼び出す必要がある以外は、initメソッドがほとんど正しいと思います。

関連する問題