1

私は、次のフレーズの「それ以外の」および「限り」の使用法と混同しています。

それ以外の場合、実装メソッドが静的型のシグニチャに従う限り、ARCはObjective-C型システムを強制しません。ARCが無効なポインタにさらされた場合、これは未定義の動作です。

ARCの目的では、有効なオブジェクトとは、「正常に動作する」保持操作を備えたオブジェクトです。具体的には、Objective-Cメッセージ送信機構が次のメッセージを正常に送信できるようにオブジェクトをレイアウトする必要があります。

  • 保持し、引数を取らず、オブジェクトへのポインタを返します。
  • リリース、引数を取らず、voidを返します。
  • 自動解放。引数を取らず、オブジェクトへのポインタを返します。

http://clang.llvm.org/docs/AutomaticReferenceCounting.html

次のことを推測できますか。

...(そうでない場合は忘れてください)...実装メソッドが静的型のシグネチャに従う場合、ARCはObjective-C型システムを適用します。

それはretain、release、autoreleaseメソッドのシグネチャについて話しているのですか?もしそうなら、それは否定的な意味を持っていますか?

実装メソッドが静的型のシグニチャに従う場合、 ARCはObjective-C型システムを強制しません。

4

2 に答える 2

1

全文は次のとおりです。

保持可能なオブジェクトポインタは、nullポインタまたは有効なオブジェクトへのポインタのいずれかです。さらに、ブロックポインタ型でnullでない場合は、実際にはブロックオブジェクトへのポインタである必要があり、クラス型(おそらくプロトコル修飾)の場合は、実際にはクラスオブジェクトへのポインタである必要があります。それ以外の場合、実装メソッドが静的型のシグニチャに従う限り、ARCはObjective-C型システムを強制しません。ARCが無効なポインタにさらされた場合、これは未定義の動作です。

英語の構文は少し複雑ですが、ポインターがクラスとして宣言されていない場合、ARCはそれに対して何もしないと言っています。

于 2012-12-12T06:53:11.823 に答える
1

第一段落

「ブロックポインタタイプ」を持つ「保持可能なオブジェクトポインタ」変数は次のとおりです。

void (^blockPointerTypeVariable)(int);

ブロックではないblockPointerTypeVariableものを指すように設定した場合、プログラムの動作は定義されていません。(ARCの要件に違反することなく、異なる型の署名を持つブロックを指すように設定できます。ただし、を指すように設定することはできません。)UIView

「<code>Classtype」を持つ「retainableobjectpointer」変数は次のとおりです。

Class someClass;

これは、「プロトコル修飾」された「<code>Classtype」を持つ「retainableobjectpointer」変数です。

Class<SomeProtocol> someClassWithProtocol;

以外のものを設定someClassまたはsomeClassWithProtocolポイントする場合Class、プログラムの動作は定義されていません。(したがって、[self class]または[UIView class]に設定することはできますが、のインスタンスを指すように設定することはできませんUIView。)

これは、特別な場合の1つではない「保持可能なオブジェクトポインタ」変数です。

UIView *view;

ARCに関する限り、何かが、、、およびの場合と同じ型アノテーションを持っている限り、UIViewこのretainポインターを任意のものを指すように設定できます。のシグニチャとは異なる型シグニチャを持つものを指す場合、プログラムの動作は定義されていません。releaseautoreleaseviewretain-[UIView retain]

2番目の段落

view何かがObjective-Cメッセージ送信システム(関数とそのバリアントを意味する)で機能し、何かが、、、を受信したときに記述されたセマンティクスを持っている限り、その変数を任意のものを指すように設定objc_msgSendできます。とメッセージ。retainreleaseautorelease

特に、これは、Objective-Cクラスのインスタンスではないものを指すことができることを意味します。これらのメモリレイアウトをobjc_msgSend期待どおりにするように注意し、それらを適切に応答させる限り、retain、、、releaseおよびautorelease。AppleはCoreFoundationタイプでこれを行います(ただし、正確には文書化されていません)。

于 2012-12-12T08:21:49.297 に答える