Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 在NSObject方法内调用super,但不在NSObject上调用_Objective C_Inheritance_Super - Fatal编程技术网

Objective c 在NSObject方法内调用super,但不在NSObject上调用

Objective c 在NSObject方法内调用super,但不在NSObject上调用,objective-c,inheritance,super,Objective C,Inheritance,Super,我在NSObject上有一个类别,它定义了一个代码如下的方法: - (NSMutableDictionary *)myMethod { NSMutableDictionary *myDict; if ([self isMemberOfClass:[NSObject class]]) { myDict = [NSMutableDictionary dictionary]; } else { myDict = [supe

我在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是根类,因此它无法使用super,因为它是根类


我可以通过使它成为基类而不是类别,并让我的所有子类继承自基类而不是NSObject来解决这个问题,但这似乎有点站不住脚。[事实上,这是错误的。编译器也不允许我从基类实现调用super——但请参阅下面gabriel_101的解决方法。]有没有办法解决这个问题?

我建议这样做:

NSMutableDictionary *myDict = [NSMutableDictionary dictionary];
Class currentClass = [self class];
while (currentClass != [NSObject class])
{
    // Add stuff to myDict using currentClass
    currentClass = [currentClass superClass];
}

在您的一条评论中,您是说您正在实现一个序列化程序,因此最好看看NSCoding和NSKeyed​阿奇弗。您可以找到如何使用这些的示例

但是,如果上述方法不适合您的问题,我将提出以下建议


由于NSObject是根类,因此它没有任何要保存的状态。因此,您可以在NSObject的类别中实现一个空的myMethod,并且可以在需要存储状态的子类中重写它。在这些子类中,调用[super myMethod]是可以的,因为它是在NSObject类别中声明的。

super
发送消息只是将该消息发送给
self
的一种方式,但告诉运行时在不同的位置开始搜索实现。在添加新方法的类别中,这没有任何意义。这个方法只有一个实现。因此,搜索只能有两个结果中的一个:找到一个实现,或者什么也找不到。由于您已经在运行one实现,调整后的搜索所能做的最好的事情就是什么也找不到

您还遗漏了这里的
操作内容。根据您在评论中所说的,我怀疑这涉及到对
[self class]
的误导性使用<代码>[self class]
对于给定对象将始终具有相同的结果。无论向
super
发送多少消息,都不会导致它以某种方式返回超类


如果要使用类链调用
class\u copyPropertyList()
,则必须执行类似于hypercrypt建议的操作:自己迭代类链。

是否尝试使用类别重写方法?这不是它们的预期用途。I的可能副本未重写现有方法。我正在编写一个序列化程序,需要沿着继承链走,因为类\u copyPropertyList不拾取超类属性在基类中是因为大多数子类不需要重写它。但是,将它作为NSObject上的一个类别没有任何好处——不需要跨需要序列化代码的不同类重用代码。通常,代码重用是通过将可重用代码放入基类中来实现的。因此,如果您有两个类共有的状态,您将创建一个MyBase类,其中包含您的公共状态和序列化代码,并将创建子类a和B,在序列化期间使用super从MyBase调用序列化代码。NSObject上的类别是为了让MyBase也可以调用super。明白了,谢谢你的解释。我正在编辑原始问题,以反映这样一个事实:在基类实现中调用super也不起作用——如果没有这个.DO,这里的东西不涉及[self class],它涉及当前实例属性的运行时内省。由于这种内省只拾取self的属性,而不是super,因此该方法需要调用super并沿着链向上走,收集self所有祖先的属性。
self
super
是同一个对象(在某种程度上说,
super
是一个对象)。在
super
上调用该方法不会产生与运行时函数不同的结果。