Objective-C:id,访问实例属性,合成?

时间:2012-04-19 12:05:25

标签: objective-c synthesize

我是Objective-C的新手,我想知道是否有一种简单的方法可以将id设置为对象实例(具有合成属性),并直接获取/设置这些属性,如:

id myID = myInstance;

myID.myProperty = something;

其中myInstance是具有名为myProperty的合成属性的对象。当我这样做时:

myInstance.myProperty = something;

它可以工作,但是当我将它换成id时我会收到错误

  

在'_strong id'

类型的对象上找不到属性'myProperty'

使用id时,是否必须手动制作getter / setter方法而不是使用synthesize?因为我似乎能够使id执行实例方法。

2 个答案:

答案 0 :(得分:9)

如果对象必须属于id类型,您可以使用消息(而不是点符号)来访问getter / setter:

id myID = ...;
NSString *prop = [myID property];
[myID setProperty:@"new value"];

但你有更好的选择:

声明一个新变量

如果您知道对象的类,只需使用该类型创建一个变量。

id myID; // defined elsewhere
MyClass *obj = (MyClass *)myID; // if you know the class, make a variable with that type
obj.property = @"new value";

铸造

使用内联强制转换来告诉编译器在不创建新变量的情况下该类型是什么。

id myID; // defined elsewhere
((MyClass *)myID).property = @"new value";

协议

如果你不知道对象的确切类,但是你知道它必须实现某些方法,你可以创建一个协议:

id<MyProtocol> myID; // the compiler knows the object implements MyProtocol
myID.property = @"new value";

答案 1 :(得分:1)

属性需要有关简单消息的更多信息。所以答案是......你不能在id对象上调用属性。 但你可以使用消息,强制转换(如果你不确定,使用反射来找出对象类型),协议......