オブジェクトは、Objective-Cのクラスのメソッドの動作を保持します
-
21-08-2019 - |
質問
クラスメソッドに渡されたオブジェクトを保持し、解除するためのベストプラクティスは何ですか?
あなたが持っている場合は、は、例えば、「クラス変数」はそうのように宣言します:
static NSString *_myString = nil
...これを行うには正しいことです。
+ (void)myClassMethod:(NSString *)param {
_myString = param;
}
...呼び出し側は、それが早期にリリースすることがないようにPARAM、カウントを保持、非ゼロを維持する必要があるという欠点を有しています。また1は、この操作を行うことができます:
+ (void)myClassMethod:(NSString *)param {
[_myString autorelease];
_myString = [param retain];
}
...対応するクラスレベルdealloc
ことなく、メモリリークが発生しますそれを呼び出すという欠点を有します。またはクラス変数ごまかしのこの種のは、おそらくより、従来の方法でオブジェクトのこれらの種類の寿命を管理シングルトンクラスで、完全に回避すべきですか?
ここでは<のhref = "http://developer.apple.com/documentation/Cocoa/Conceptual/CocoaFundamentals/CocoaObjects/CocoaObjects.html#//apple_ref/doc/uid/TP40002974-CH4-SW32" のrel = "nofollowをnoreferrer">シングルトンインスタンスを作成する上で、Appleのドキュメントます。
私が働いているコードは客観非常に滑らかな(しかし、まだ新しい)資源プロジェクトがある(のhttp:/ /www.iphoneonrails.com/する)。
解決
保持し、絶対に、離します。メモリはとにかく解放される時 - プログラムの終了時に、クラスのdealloc
が呼び出されることになるだけの時間があるので、それはリークではありません。最初の方法でそれを行うと、より手間こととCocoaのメモリ管理ガイドラインに反するでしょう。
これはクラスメソッドまたはシングルトンであるべきかどうかについては:クラス自体は、一般的に独立した多くの機能を持つべきではありません。あなたはクラス変数の不足から見ることができるように彼らはただ、Objective-Cの中にそのように設計されていませんでした。クラスメソッドは、一般的に作成し、インスタンスを管理し、時にはすべてのインスタンスの共有プロパティまたはデフォルト値を格納に対処する必要があります。クラスの実際の機能は、インスタンスに行く必要があります。これは、Objective-Cの中のコンベンションです。
(もちろん、そこにはObjective-Cの神ではありません、あなたが規則を無視するのは自由ですが、それは一般的な知恵です。)
他のヒント
また、NSString
または(NSArray
またはNSDictionary
など)変更可能なバリエーションを持つ任意のクラスの場合、私は強くパラメータをコピーする代わりに、それを維持するお勧めします。呼び出し側があなたを渡された文字列がNSMutableString
だった場合、その値は後で変更することができ、そしてそれは同様にあなたのクラスに変更されます。これは、あなたが望むものはおそらくないので、私はこれをやってお勧めする:
+ (void)myClassMethod:(NSString *)param {
[_myString release];
_myString = [param copy];
}
copy
方法は、コピーを作成し、あなたはすべての限り変数を保持することは懸念しているように設定しているので、1に保持カウントを設定します。呼び出し側はあなたにNSString
を通過しない場合や、追加のボーナスとして、そのクラスは、その値は変更できないことを知っているのに十分スマートですので、それは単にオブジェクトのコピーを作成することを避けるために自分自身を保持します。それはどのように賢いですか。