4

クラス メソッドに渡されたオブジェクトを保持および解放するためのベスト プラクティスは何ですか?

たとえば、次のように宣言された「クラス変数」があるとします。

static NSString *_myString = nil

...これを行うのは正しいことです:

+ (void)myClassMethod:(NSString *)param {
    _myString = param;
}

...これには、呼び出し元が、途中で解放されないように、param でゼロ以外の保持カウントを維持する必要があるという欠点があります。あるいは、これを行うこともできます:

+ (void)myClassMethod:(NSString *)param {
    [_myString autorelease];
    _myString = [param retain];
}

dealloc...これには、対応するクラスレベルの呼び出しがないとメモリリークが発生するという欠点があります。それとも、この種のオブジェクトの有効期間をより従来の方法で管理するシングルトン クラスを使用して、この種のクラス変数ごまかしを完全に回避する必要がありますか?

シングルトン インスタンスの作成に関する Apple のドキュメントは次のとおりです。

私が取り組んでいるコードは、非常に洗練された (しかしまだ新しい) Objective Resource プロジェクト ( http://www.iphoneonrails.com/ ) です。

4

2 に答える 2

3

絶対に保持して解放してください。クラスdeallocが呼び出されるのはプログラムの終了時のみであるため、これはリークではありません。プログラムが終了すると、とにかくメモリが解放されます。最初の方法で行うのは面倒であり、Cocoa のメモリ管理ガイドラインに反します。

クラスメソッドにするかシングルトンにするかについては、クラス自体は通常、多くの独立した機能を持つべきではありません。クラス変数がないことからわかるように、Objective-C ではそのように設計されていません。クラス メソッドは通常、インスタンスの作成と管理を処理し、場合によってはすべてのインスタンスの共有プロパティまたはデフォルトを格納する必要があります。クラスの実際の機能はインスタンスに入る必要があります。それが Objective-C の規則です。

(もちろん、Objective-C の神は存在せず、慣習を無視するのは自由ですが、それが一般的な知恵です。)

于 2009-03-24T03:20:13.643 に答える
3

また、 または のようNSStringな変更可能なバリアントを持つクラスの場合、パラメーターを保持するのではなくコピーすることを強くお勧めします。呼び出し元が渡した文字列が だった場合、その値は後で変更される可能性があり、クラスでも変更されます。これはおそらくあなたが望むものではないので、これを行うことをお勧めします:NSArrayNSDictionaryNSMutableString

+ (void)myClassMethod:(NSString *)param {
    [_myString release];
    _myString = [param copy];
}

このcopyメソッドはコピーを作成し、保持カウントを 1 に設定するため、変数の保持に関する限り、すべて設定されています。さらにおまけとして、呼び出し元が を渡した場合NSString、そのクラスはその値が変更できないことを認識できるほどスマートであるため、オブジェクトのコピーを作成しないようにそのまま保持されます。それはどれほど賢いですか?

于 2009-03-24T04:54:15.087 に答える