ObjectiveC - オブジェクトをパラメータとして追加して解放します。
Java開発者である私はまだObjectiveCのメモリ管理に苦労しています。私はすべての基本をカバーしていますが、しばらくして私は挑戦に遭遇します。 MyObject
クラスのコンストラクタは、私はオンザフライ開始タイプMyParameterObject
のパラメータを取り
MyObject myObject = new MyObject(new MyParameterObject());
:私は何をしたいか
は、Javaで次のようになりますものです。これは私に実際に発生しMyParameter
オブジェクトに対して警告「オブジェクトの潜在的な漏れ」を与えるツールのビルドを実行している、しかし
MyObject *myObject = [[MyObject alloc] init:[[MyParameterObject alloc] init]];
と分析:ObjectiveCで
は、私は、この使用して、次のコードを実行しようとしました私はInstrumentsを使ってそれをテストします。私はalloc
メソッドを使ってオブジェクトの所有権を取得しており、放棄していないので、なぜこのようなことが起こるのか理解しています。正しい方法はわかりません。 は私が
MyObject *myObject = [[MyObject alloc] init:[[[MyParameterObject alloc] init] autorelease]];
を使用してみましたが、その後の分析ツールは、「オブジェクトが何回も-autorelease送ら」と言ってくれました。
return self;
の代わりに、MyParameterObject
のinit
メソッドをreturn [self autorelease];
と変更して問題を解決できました。 Analyzeは依然として潜在的なリークについて警告しますが、実際には発生しません。しかし、私はこのアプローチがObjectiveCのメモリを管理するための規約に違反していると確信しています。
Thanx事前に。
あなたが提案した最初のアプローチを使用してやります。私はそれについて自分自身について考えていたが、あなたの(全体の)答えは私に確信した。私はちょうど私がJavaとC#から常にObjectiveCで動作していないものをやっていることを行う "怠惰な"方法のいくつかを受け入れる必要があると思います: – pajevic
+1正しい、**あなたは決して使用しないでください ' -retainCount'、何でもいい理由** –
@NobleK、残念ながら。客観的なCは非常に、非常に言葉です。そして、個々のメソッドに対して単一のメソッド呼び出しを持つことは非常に好きです。また、アップルが行っているのと同じパターンのコードを使用することで、Analyzeツールを混乱させることはありません。 –