如果我们将自定义对象类型转换为id
,会发生什么
我遇到了从不兼容的类型Myclass* __Strong
分配给id
的问题
工作代码:
self.delegate=(id)mycustomobject;
然后我把我的对象键入id
,一切都很好,起到了符咒的作用。
但我的问题是,以后会不会出现任何意外的问题。如果是,避免这种警告的最佳方法是什么。
要回答问题的第一部分,如果将对象分配给id
,则对象将在编译时范围内失去类关联,这意味着如果在类MyClass
中具有NSString
类型的属性名称myProp
,并且执行类似的操作
id tempVar = (id)objMyClass;
那么您将无法在编译时访问属性CCD_ 9。
NSString *propValue = tempVar.myProp; // This will throw an error "Property not found".
要解决您在分配对象时遇到问题的原因,是因为您将属性delegate
声明为符合MyClassProtocol
协议的id
类型,类似于
@property (nonatomic,assign) id<MyClassProtocol> delegate;
但是,您在课程MyClass
中没有遵守MyClassProtocol
。因此,当您使用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>
,即符合该协议的任何数据类型。