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

Wil*_*eur 5 objective-c synthesize

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

id myID = myInstance;

myID.myProperty = something;
Run Code Online (Sandbox Code Playgroud)

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

myInstance.myProperty = something;
Run Code Online (Sandbox Code Playgroud)

它可以工作,但是当我把它换成id时我得到了错误

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

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

jtb*_*des 9

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

id myID = ...;
NSString *prop = [myID property];
[myID setProperty:@"new value"];
Run Code Online (Sandbox Code Playgroud)

但是你有更好的选择:

声明一个新变量

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

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

铸件

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

id myID; // defined elsewhere
((MyClass *)myID).property = @"new value";
Run Code Online (Sandbox Code Playgroud)

协议

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

id<MyProtocol> myID; // the compiler knows the object implements MyProtocol
myID.property = @"new value";
Run Code Online (Sandbox Code Playgroud)