2

分类问题:

我想在 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
}

谢谢

4

3 回答 3

6

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

于 2012-09-09T09:06:12.747 回答
2

您不应该使用类别来覆盖现有方法。类别用于增强类行为而不对其进行子类化。(尽管我认为您可以覆盖它,但 Apple 强烈反对)

于 2012-09-09T09:01:47.993 回答
2

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

导入您的类别后,它不再做它应该做的事情。苹果不推荐这个!

于 2012-09-09T09:06:54.040 回答