/ / Objc Cocoa MRC-リリースおよび自動リリースされたオブジェクト

Objc Cocoa MRC - リリースされ、自動リリースされたオブジェクト私はアプリケーションを見るために彼を書かなければならない - objective-c、metal

Metal APIを使用してC ++アプリケーションを作成しています(目的C)およびMRC(手動参照カウント)。 ObjCの使用経験は非常に限られています。ほとんどのMetal APIオブジェクトはプロトコルとして定義され、C関数または他のオブジェクトのメソッド(MTLDevice newBufferWithLengthなど)から返されるオブジェクトとして作成されます。この方法で作成されたオブジェクトを解放する方法を知るには、自動解放を設定するかどうか(たとえば、保持カウント1で自動解放されたオブジェクトを解放することはできません)。問題は、この質問に答えるMetal APIドキュメントの説明を見つけることができないことです。私は、いわゆる軽量オブジェクトがすべて自動リリースされて作成されることをユーザーガイドで読んだだけです。自動解放されたオブジェクトには3つの例がありますが、残りのオブジェクトは自動解放されていないと仮定できるかどうかはわかりません。 cocoaでは、多くのオブジェクトがalloc + initなしで作成され、静的メソッド(ex NSString文字列)から返されるため、問題はMetal関連だけではないようです。

ご協力ありがとうございました。

回答:

回答№1は2

通常のObjective-Cルールは、スコープを作成することですオブジェクトを解放する責任もあります。したがって、十分に文書化された例外を除き、事実上すべての場合、返されたオブジェクトは自動解放されます(両方とも戻り値または引数を介して返されます)。より正確な確認方法は、オブジェクトが常に+0で返されることです。 スコープローカル保持カウント、必要に応じて保持することが期待されます。 マニュアルを読むと、Metal APIはAppleのフレームワークの1つであるため、太字のステートメントで警告されない限り、このルールに従う必要があります。Objective-CのC関数もそのように動作します。およびリソース管理に関する機能。)

そのためには「alloc-init vs. [NSString string] "部分:MRCコードは、すでに+0である[NSString string]または[[[NSString alloc] init] autorelease]を返します。それ以外の場合は、規則に違反します。例外は -[init] そして +[new...] +1を返すメソッド自体。 ARCでは、ARCは規則を知っており、正しいことを行い、可能な限り過剰な保持/解放を最適化するため、alloc-init / stringの間に違いはありません。

また、 -[retainCount] これは無意味で「有害」と見なされます。これは、保持されている自動解放呼び出しの実行回数と、自分のオブジェクトでも有効なobjc-runtimeアカウンティングが分からないためです。

ARCは、あなたが「コンテキストの欠如のために保持カウントやサイクルを明示的に管理する必要がある、なんらかのObjective-CからWhateverへのブリッジを記述します。それはあなたから何も取らず、ほとんどの場合、リソースをまったく管理しないという大きな利点をもたらします。