如何让objective-c编译器假设未声明的属性是动态的?

时间:2012-10-03 16:12:38

标签: objective-c properties compiler-errors compiler-warnings

我希望能够写

id foo = [MyObject new];
foo.bar = [NSObject new];

但是我收到以下错误:

/blah/blah/blah/Blah.m:32:9: error: property 'bar' not found on object of type '__strong id'
foo.bar = [NSObject new];
    ^
1 error generated.

由于clang没有报告我可以压制的警告,我认为这种行为是永久性的,但我希望有人可以告诉我。

显然,我知道这会在默认情况下中断,但我打算使用Dynamic Method Resolution来使其正常工作。

2 个答案:

答案 0 :(得分:3)

您不能在像这样的通用对象指针上使用点语法。

原因是编译器会将foo.bar = baz;重写为[foo setBar:baz],但由于您可以更改设置者的名称@property (strong, nonatomic, setter=setListOfApples:) NSArray * listOfOranges;,因此必须才能看到财产声明。

如果您使用标准消息发送语法,这将起作用。换句话说,您必须告诉编译器对象的确切类型,以便它可以查找属性的setter,或者告诉它您希望它使用的确切setter名称。

答案 1 :(得分:-2)

@dynamic会照顾它吗?

@dynamic foo; @dynamic bar;