カスタム オブジェクトを に型キャストするとどうなるかid
、
id
互換性のない型からの割り当てに問題がありましたMyclass* __Strong
作業コード:
self.delegate=(id)mycustomobject;
次に、オブジェクトをタイプキャストしましid
たが、それはすべてうまくいき、魅力的でした。
しかし、私の質問は、後で予期せず発生する問題があるかどうかです。もしそうなら、そのような警告を回避する最善の方法は何ですか.
質問の最初の部分に答えるために、オブジェクトにオブジェクトを割り当てるとid
、コンパイル時のスコープでクラスの関連付けが失われます。つまり、クラスmyProp
にNSString
タイプのプロパティ名があり、次のMyClass
ようなことを行う場合
id tempVar = (id)objMyClass;
myProp
コンパイル時 にプロパティにアクセスできなくなります。
NSString *propValue = tempVar.myProp; // This will throw an error "Property not found".
オブジェクトの割り当てで問題に直面していた理由に対処するには、プロパティをプロトコルに 準拠delegate
する型として宣言したためです。id
MyClassProtocol
@property (nonatomic,assign) id<MyClassProtocol> delegate;
ただしMyClassProtocol
、クラス内には準拠していませんMyClass
。したがって、id
型キャストを使用してコードを記述している場合、実際にはid
型オブジェクト (デリゲート) をMyClass
コンパイラの観点から間違ったオブジェクトに割り当てています。
self.delegate = mycustomobject; // Wrong; delegate data type is id while your custom object is of type MyClass
したがって、MyClass
プロトコルにself
準拠すると、準拠するデータ型になり、MyClassProtocol
最終的id<MyClassProtocol>
にはそのプロトコルに準拠するすべてのデータ型をサポートします。