我在NSObject上有一个类别,用以下代码定义一个方法:
- (NSMutableDictionary *)myMethod
{
NSMutableDictionary *myDict;
if ([self isMemberOfClass:[NSObject class]]) {
myDict = [NSMutableDictionary dictionary];
}
else {
myDict = [super myMethod];
}
// DO STUFF HERE WITH myDict ...
return myDict;
}
它以NSObject cannot use super because it is a root class
失败。
我可以通过使它成为基类而不是类别来解决这个问题,让我所有的子类继承而不是来自NSObject,但这看起来有点蹩脚。 [实际上,这是错误的。编译器不会让我从基类实现调用super - 但是请参阅下面的gabriel_101的解决方法。]有什么方法可以解决这个问题吗?
答案 0 :(得分:1)
我建议做这样的事情:
NSMutableDictionary *myDict = [NSMutableDictionary dictionary];
Class currentClass = [self class];
while (currentClass != [NSObject class])
{
// Add stuff to myDict using currentClass
currentClass = [currentClass superClass];
}
答案 1 :(得分:1)
向super
发送消息只是将该消息发送到self
的一种方式,但是告诉运行时在不同的地方开始搜索实现。在添加新方法的类别中没有任何意义。该方法只有一种实现方式。因此,搜索只能有两个结果中的一个:它发现一个实现或它什么也没找到。由于您已经在运行一个实现,因此调整后的搜索可以做的最好的事情就是找不到任何内容。
你也遗漏了DO STUFF HERE
的所有内容。从您在评论中所说的内容来看,我怀疑它涉及误用[self class]
。对于给定对象,[self class]
将始终具有相同的结果。对super
的任何消息都不会导致以某种方式返回超类。
如果你想用类链调用class_copyPropertyList()
,那么你必须做一些类似于hypercrypt所建议的事情:自己迭代类链。
答案 2 :(得分:0)
在你的一条评论中,你说你正在实施一个序列化器,因此最好看一下NSCoding和NSKeyed Archiver。您可以找到如何使用这些here的示例。
但如果上述情况不适合您的问题,我会建议如下。
由于NSObject是根类,因此它没有任何要保存的状态。因此,您可以在类别中为NSObject实现一个空的myMethod,并且可以在需要存储状态的子类中覆盖它。在这些子类中,可以调用[super myMethod],因为它是在NSObject类别中声明的。