1

このドキュメントでは、MRR(手動保持リリース)環境で記述されたコードと連携するために、ARC環境で記述されたコードに「new」で始まるアクセサー名を付けることはできないと述べています。ARCがなぜメソッドの命名に関するこの制限。

4

1 に答える 1

4

原因はこれによるものだと思います。

5.2.1。initのセマンティクス

initファミリーのメソッドは、暗黙的に自己パラメーターを消費し、保持されたオブジェクトを返します。これらのプロパティはいずれも、属性を介して変更することはできません。

セルフ(括弧で囲まれている、またはキャストされている可能性があります)またはスーパーのいずれかであるレシーバーを使用したinitメソッドの呼び出しは、デリゲートinit呼び出しと呼ばれます。initメソッドから、およびそのようなメソッド内のブロックを除外する場合を除いて、デリゲートinit呼び出しが行われるのはエラーです。

通常のルールの例外として、変数selfはinitメソッドで変更可能であり、__strong変数の通常のセマンティクスを持っています。ただし、これは未定義の動作であり、プログラムは不正な形式であり、デリゲートinit呼び出しの完了後にinitメソッドが以前のselfの値を使用しようとした場合、診断は必要ありません。initメソッドが自分自身を返すのは従来の方法ですが、必須ではありません。

プログラムが同じオブジェクトのinitメソッドを2回以上呼び出すことは未定義の動作です。ただし、各initメソッドの呼び出しは最大で1つのデリゲートinit呼び出しを実行できます。

ソース:http ://clang.llvm.org/docs/AutomaticReferenceCounting.html#family.semantics.init

慣例によりnewで始まるメソッド名は、過去にallocメソッドとinitメソッドの両方を呼び出すために使用されていましたが、Appleのフレームワークで「new」規則を使用して使用されるメソッドはまだあると思います。ARCは、メモリ管理に関してこれをまだ考慮していると思います。

以下もお読みください:http://clang.llvm.org/docs/AutomaticReferenceCounting.html#family

Objective-Cのメソッドは、Cocoaの規則によってそれに起因する従来の一連の動作であるメソッドファミリーに分類される場合があります。

次の場合、メソッドは特定のメソッドファミリに含まれます。

  • objc_method_family属性があり、そのファミリに配置されます。またはそうでない場合は、
  • objc_method_family属性がないため、別のファミリに配置されているか、ファミリがありません。
  • そのセレクターは対応するセレクターファミリーに分類され、
  • そのシグニチャは、メソッドファミリの追加された制限に従います。

セレクターは、先頭の下線を無視して、セレクターの最初のコンポーネントが完全にメソッドファミリーの名前で構成されているか、その名前の後に小文字以外の文字が続く場合、特定のセレクターファミリーに含まれます。たとえば、_perform:with:とperformWith:はperformファミリに分類されますが(認識した場合)、performing:withは分類されません。

家族とその追加の制限は次のとおりです。

  • allocメソッドは、保持可能なオブジェクトポインタ型を返す必要があります。
  • copyメソッドは、保持可能なオブジェクトポインタ型を返す必要があります。
  • mutableCopyメソッドは、保持可能なオブジェクトポインタ型を返す必要があります。
  • 新しいメソッドは、保持可能なオブジェクトポインタタイプを返す必要があります。
  • initメソッドはインスタンスメソッドである必要があり、Objective-Cポインタ型を返す必要があります。

さらに、プログラムは、戻り型がidでも、宣言クラスのスーパークラスまたはサブクラスへのポインターでもないinitメソッドの呼び出しを宣言または含む場合、不正な形式になります(メソッドがクラスで宣言された場合)。 )または呼び出しの静的レシーバータイプ(プロトコルで宣言されている場合)。

上記は、ARCのメカニズムを回避するために、 newObjectの代わりにnewobjectのようなメソッドを呼び出すことができることを意味していると思いますが、コードを操作する人にとってはあまり意味がないかもしれません。おそらく、カスタムのnew *メソッドに属性を設定して、プロパティに他のメソッドファミリを強制することで、通常のメモリルールを回避することもできます。

于 2012-04-09T08:51:26.453 に答える