使用属性语法的编译要求在编译时知道接收器的类型。我可能不明白某些东西,但考虑到 Objective-C 是一种动态语言,这似乎是一个损坏或不完整的编译器实现。
属性“comment”定义为:
@property (nonatomic, retain) NSString *comment;
并合成:
@synthesize comment;
“document”是符合以下条件的几个类之一的实例:
@protocol DocumentComment <NSObject>
@property (nonatomic, retain) NSString *comment;
@end
并且简单地声明为:
id document;
使用以下属性语法时:
stringObject = document.comment;
gcc 产生以下错误:
error: request for member 'comment' in something not a structure or union
但是,以下等效的接收器方法语法在编译时不会出现警告或错误,并且在运行时可以正常工作(如预期):
stringObject = [document comment];
我不明白为什么属性要求在编译时知道接收器的类型。我有什么遗漏的吗?我只是使用后一种语法来避免接收对象具有动态类型的情况下的错误。属性似乎是半生不熟的。
编译属性访问需要知道如何将属性名称转换为正确的 getter/setter 名称。如果不知道接收者的类型,编译器就不可能知道 getter/setter 的名称,因为属性可能会覆盖名称作为其声明的一部分,如下所示:
@property (nonatomic, retain, getter=myComment) NSString *comment;
如果编译器继续为您的无类型示例生成代码,它将生成[document comment]
,这将在运行时失败,因为正确生成的代码实际上是[document myComment]
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)