5

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

id myID = myInstance;

myID.myProperty = something;

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

myInstance.myProperty = something;

它可以工作,但是当我将其切换为 id 时,我得到了错误

在“_strong id”类型的对象上找不到属性“myProperty”

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

4

2 回答 2

9

如果对象必须是 type 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";
于 2012-04-19T12:12:54.003 回答
1

Properties need more information respect to simple messages. So the answer is.. you can't call a property on an id object. But you can use messages, casting (if you are not sure, use reflection to find out the object type), protocols...

于 2012-04-19T12:14:22.627 回答