使用类别覆盖NSURL方法

时间:2012-09-09 08:54:49

标签: objective-c ios nsurl objective-c-category

分类问题:

我想在NSURL上放置一个类别,在执行其他操作时,会覆盖查询方法,以便能够从不符合RFC 1808的URL提供查询字符串。在我的类别中做这样的事情是否合法:

- (NSString *)query //real NSURL method
{
     if (stringIsRFC1808) //want to get the default implementation
          return [super query];
     else 
          return somethingElse; //want to get my custom implementation
}

感谢

3 个答案:

答案 0 :(得分:6)

代码按原样无效,因为您正在使用[super query] - 这并不能完全按照您的预期执行操作。类别不是超类。这里[super query]将尝试调用- [NSObject query] - BOOM无法识别的选择器错误。如果你使用类别扩展一个类,你将无法调用原始方法 - 如果你不需要这个功能,那么使用类别就没问题了,但是,如果你确实需要它,你应该考虑子类化,(甚至更好的基础对象组合!)或使用Objective-C运行时执行method swizzling - 这样你就可以访问该方法的原始实现。

答案 1 :(得分:2)

您不应使用类别来覆盖现有方法。 类别用于增强类行为,而不对其进行子类化。 (虽然我认为你可以覆盖它但是苹果强烈反对)

答案 2 :(得分:2)

添加自己的方法,以免与苹果sdk发生冲突。考虑一下贵公司中使用此类别的人:他做的第一件事就是查看开发人员库,了解这种方法的作用。

导入您的类别后,它不再执行应该执行的操作了。 Apple不推荐这个!