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

标签 objective-c synthesize

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

id myID = myInstance;

myID.myProperty = something;

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

myInstance.myProperty = something;

它可以工作,但是当我将它切换为 id 时出现错误

Property 'myProperty' not found on object of type '_strong id'

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

最佳答案

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

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";

协议(protocol)

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

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

关于Objective-C:id,访问实例属性,合成?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10227661/

相关文章:

ios - 使用单个数组内容在 3 个 UIButton 中随机显示图像

objective-c - 我什么时候应该明确使用@synthesize?

c++ - Boost Spirit Qi Custom Syntesized Attribute(通过语义操作设置结构属性的特定成员)

objective-c - 在什么情况下@synthesize 在 Objective-c 中是自动的?

objective-c - 在Objective-C中使用指针式分配与 setter 方法有多危险?

ios - 字符串中的多个错误

iphone - UITableView索引滚动问题

objective-c - 使用UIWebView调用Upload方法

ios - 使用视频/相机时未触发 AVAudioSessionInterruptionNotification

ios - 你如何在 Swift 中转换 @synthesize 协议(protocol)变量?