在 Objective C 类别中使用 Super?

2024-01-02

我想重写 Objective C 类中的一个方法,但我没有源代码。

我已经研究过了,看来类别应该允许我这样做,但我想在我的新方法中使用旧方法的结果,使用 super 来获取旧方法的结果。

每当我尝试这个时,我的方法都会被调用,但“超级”为零......知道为什么吗?我正在使用 XCode 2.2 SDK 进行 iPhone 开发。我肯定正在使用类的实例,并且该类的方法是实例方法。

@implementation SampleClass (filePathResolver)
-(NSString*) fullPathFromRelativePath:(NSString*) relPath
{
    NSString *result = [super fullPathFromRelativePath: relPath];

  ... do some stuff with the old result

    return result;
}

注意和澄清:从我在苹果文档中看到的内容来看,我认为这应该被允许?

developer.apple.com 上的类别文档: https://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/ObjectiveC/Articles/ocCategories.html#//apple_ref/doc/uid/TP30001163-CH20-SW1当类别重写继承的方法时,该类别中的方法 像往常一样,类别可以调用 通过消息继承实现 到超级。然而,如果一个类别 覆盖已经存在的方法 存在于该类别的类中,有 无法调用原始的 执行。


类别扩展了原始类,但它们没有子类化它,因此调用super没有找到方法。

你想要的叫做方法混合 http://cocoadev.com/MethodSwizzling。但请注意,您的代码可能会破坏某些内容。有一篇文章是关于斯科特·史蒂文森 (Scot Stevenson) 所著《Theocacao》 http://theocacao.com/document.page/266关于旧 Objective-C 运行时中的 Method Swizzling,马特·加拉格尔的《可可与爱》 http://cocoawithlove.com/2008/03/supersequent-implementation.html有一篇关于新 Objective-C 2.0 运行时中的 Method Swizzling 及其简单替换的文章。

或者,您可以对类进行子类化,然后使用子类或使用+ (void)poseAsClass:(Class)aClass http://developer.apple.com/mac/library/documentation/Cocoa/Reference/Foundation/Classes/NSObject_Class/DeprecationAppendix/AppendixADeprecatedAPI.html#//apple_ref/occ/clm/NSObject/poseAsClass:来替换超类。苹果写道:

由 pose 类定义的方法 可以通过留言super, 合并超类方法 it 覆盖。

请注意,Apple 已弃用poseAsClass:在 Mac OS X 10.5 中。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Objective C 类别中使用 Super? 的相关文章

随机推荐