Objective c 在NSObject方法内调用super,但不在NSObject上调用
我在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
- (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
上调用该方法不会产生与运行时函数不同的结果。