众所周知,obj.foo
将编译为[obj foo]
@property getter
我的obj
是一个在运行时存储属性的代理对象
但是-foo
选择器在编译时不会定义
id obj = ...; // obj can perform -foo at runtime, but not at compile time
id obj1 = [obj foo]; // may compile
id obj2 = obj.foo; // compile error
我可以使用一些#pragma
技巧来停止编译时检查吗?
或者以某种方式让编译器开心?
答案 0 :(得分:1)
如果obj
是Foo
类型的对象(具有foo
属性)的代理,那么只需执行自然的操作并使用Foo *
作为其类型。
只有当已知静态类型响应此选择器时,编译器才会允许点语法。 id
无效。
答案 1 :(得分:1)
通过将obj
声明为类型id
,您告诉编译器obj
可能是任何类的实例,因此编译器不知道它是否具有任何特定属性或方法。如果您必须认为obj
可以是多个类,但只有foo
属性的类,请尝试使用protocol。
id<ObjectWithFoo> obj = /* ... */
obj.foo // no error