-1

カスタム オブジェクトを に型キャストするとどうなるかid

id互換性のない型からの割り当てに問題がありましたMyclass* __Strong

作業コード:

self.delegate=(id)mycustomobject;

次に、オブジェクトをタイプキャストしましidたが、それはすべてうまくいき、魅力的でした。

しかし、私の質問は、後で予期せず発生する問題があるかどうかです。もしそうなら、そのような警告を回避する最善の方法は何ですか.

4

1 に答える 1

0

質問の最初の部分に答えるために、オブジェクトにオブジェクトを割り当てるとid、コンパイル時のスコープでクラスの関連付けが失われます。つまり、クラスmyPropNSStringタイプのプロパティ名があり、次のMyClassようなことを行う場合

id tempVar = (id)objMyClass;

myPropコンパイル時 にプロパティにアクセスできなくなります。

NSString *propValue =  tempVar.myProp;   // This will throw an error "Property not found".

オブジェクトの割り当てで問題に直面していた理由に対処するには、プロパティをプロトコルに 準拠delegateする型として宣言したためです。idMyClassProtocol

@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>にはそのプロトコルに準拠するすべてのデータ型をサポートします。

于 2015-04-02T13:11:18.500 に答える