がtypedefである:Objective-C; typedef objc_objectはポインタのないidの代わりに使用します。
typedef struct objc_object {
Class isa;
} *id;
だから宣言(および初期化)することができる可変例えばこのように:
// using id
id po_one = @"one";
コンパイルは正常です。だから、
typedef struct objc_object O;
変数:
私は自分のスキームで私のタイプに名前を付けているので、私はこのように(オブジェクトのOと)自分のtypedefを追加したいのtypedef私はIDで暗黙のポインタを嫌うので、
は、私の知る限りのtypedefを理解するように私は、後者がと同等であるべきと考えました。初期化Iから:これは警告でコンパイル
// using O O * po_two = @"two";
:(初期化付き)の宣言は次のようになります再び罰金コンパイル
// using struct objc_object struct objc_object * po_three = @"three";
:ncompatibleポインタ タイプ
po_two = po_one;
po_two = po_three;
両方が警告なしにコンパイル:
それは驚くべきことです。
だから私は試してみました:
typedef struct objc_object * PO;
私はポインタ(私は避けたい正確なものであること - これだけのテストの理由で)が含まれている場合、それは警告なしに動作するかどうかを確認するための外のtypedefかどうかを確認します構造体定義は構造体定義のtypedef(この場合はidの定義)とは異なる働きをします。
// using PO
PO po_four = @"four";
これもうまくいきます。
私が使用している場合:
#define O struct objc_object
Oを使用して構築物は再び警告なしにコンパイルします。
しかし、できる限り定義の代わりにtypedefを使用する方が好きです。
私は困惑しています。 typedefに関する私の誤解は何ですか?
どのコンパイラ? – JeremyP
また、 'O *'の代わりに 'NSObject *'を使うこともできます。 'NSObject * po_two = @" two ";'、ほとんどの場合です。 –