在GNU ObjuleC运行时,我能将半个任意的数据附加到实例变量吗?挑战:作为一个宠物项目,我目前正在为Linux开发一种Cocoa Worklike。(请不要让所有的“使用GNUSTEP”的东西偏离。我知道,但不适合我的需要。接下来……)为此,我试图拼凑一个简单的ORM系统,让人想起Perl的dbix::类。一般的想法是使声明尽可能简单(读:短),如果可能的话,不需要提供覆盖的+(id)constantClassAttribute方法。一般的想法是声明我的结果类如下:@interface SomeTable : ORMResult { unsigned long long id; ORMResult *toOneRelation; ORMResultSet *toManyRelation;}@end到目前为止,太棒了。现在,我可以使用 >来访问这些字段,并做各种讨厌的事情,比如像“cc”或“cc”这样的“自动生成”。小菜一碟。不幸的是,有两条信息我无法使用此设置添加;一条足够简单,可以解决,另一条不太重要:实际的结果类是什么?这可以通过子类化[ORMResult self]->ivars(比如-[toManyRelation])并将其插入在那里,使用运行时DYAMAM(AG)IC来计算它的正确性(ToMon,toOne)。(这是个棘手的问题!)这段关系可以作废吗?这不太容易解决。我最初的想法是(ab)使用协议,如:@interface SomeTable : ORMResult { unsigned long long id; ORMResult <ORMNullable> *toOneRelation;}@end但不幸的是,当我试图使用gdb检查-[setToOneRelation]条目我发现协议信息实际上没有保存用于运行时的玩具。我想这是一种扭曲的感觉,协议声明主要用于编译器。滥用协议标识符(ORMResult,SomeTable和friends,使用defines:@interface SomeTable : ORMResult { unsigned long long id; nullable OMRResult *toOneRelation;}@end这有一个相当明显的缺点,就是不能实际工作,因为说明符显然只在协议方法声明中起作用。那么,问题是,如何才能在实践中把这些信息附加到ivar上呢?注意:如前所述,我使用GNU ObjuleC运行时,由GCC在Linux上提供,而不是由苹果提供的!编辑:星痘!我忘记了一个中心点:当然,另一个选择是简单地使所有关系都无效。这不是我真正想要的,但是如果没有其他选择存在,我想这就是我最终要走的路。 (adsbygoogle = window.adsbygoogle || []).push({}); 最佳答案 在过去的Mac上,我们是如何创建一个全局变量来保存一个nsmutabledictionary,我们将要附加到对象上的数据放入其中。只需使用指针的字符串表示形式作为键即可。唯一的困难是,当一个对象消失了,并确保它的字典中的条目也被删除。您可能不得不使用类似于黑客的方法swizzling-dealloc来实现这一点。 (adsbygoogle = window.adsbygoogle || []).push({}); 09-25 15:42