在NSObject方法中调用super,但在NSObject上调用

时间:2014-08-24 22:31:01

标签: objective-c inheritance super

我在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的解决方法。]有什么方法可以解决这个问题吗?

3 个答案:

答案 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类别中声明的。