2009-03-24 10 views
4

クラスメソッドに渡されたオブジェクトの保持と解放のベストプラクティスは何ですか?例えばObjective-Cクラスメソッドのオブジェクト保持動作

、あなたは "クラス変数" はそうのように宣言している場合:

static NSString *_myString = nil 

...これを行うには正しいことである:

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

...持っています早期に解放されないように、呼び出し側がparamで非ゼロの保持カウントを維持する必要があるという欠点があります。また一つはこれを行うことができます:対応するクラスレベルdeallocコールせずに、それはメモリリークが発生しますという欠点があった

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

を...。あるいは、この種のクラス変数は、従来の方法でこれらのオブジェクトのライフタイムを管理するシングルトンクラスを使用して完全に回避する必要がありますか?

ここにはApple's docs on creating a singleton instanceです。

私が作業しているコードは非常に滑らかですが(しかし、まだ新しい)Objective Resourceプロジェクト(http://www.iphoneonrails.com/)です。

+0

あなたは間違った質問をしています。グローバル変数の実行方法を尋ねる代わりに、グローバルを取り除く助けを求めるべきです。そして、はい、これをクラスメソッド(またはシングルトン)の背後に隠しても、これはまだグローバル変数です。 – Sven

答えて

3

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

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

(もちろん、そこにはObjective-Cの神はありません、あなたが規則を無視するのは自由ですが、それは一般的な知恵です。)

+0

クラスにはdeallocメソッドがありません。インスタンスのみが行います。 – dreamlax

+0

ええ、クラスのためのdeallocはありませんが、それは問題ではありません。正規のプログラム終了時にグローバルに保持されているメモリは、通常、リークとはみなされません(シングルトンはすべてこのように動作します)。 確実に保持を使用してください。 –

+0

私はクラスがdeallocメソッドを持っていないことを知っています。それは私が意味することです:たとえ授業がそのようなメソッドを持っていたとしても、呼び出されることはありません。 – Chuck

3

はまた、NSStringの場合または変更可能な変種を(持っている任意のクラスでNSArrayまたはNSDictionaryのように)、パラメータを保持する代わりにコピーすることを強くお勧めします。呼び出し側が渡した文字列がNSMutableStringだった場合、その値は後で変更され、クラス内でも変更される可能性があります。これは、あなたが望むものはおそらくないので、私はこれをやってお勧めする:あなたは、すべての限り変数を保持することであるように設定しているので

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

copy方法は、コピーを作成し、1に保持カウントを設定し、心配している。また、追加のボーナスとして、発信者がNSStringを渡した場合、そのクラスは値が変更できないことを知るほどスマートであるため、オブジェクトのコピーを作成しないように保持します。それはどれくらい賢いですか?

関連する問題