【问题标题】:Using a category to override NSURL method使用类别覆盖 NSURL 方法
【发布时间】:2012-09-09 08:54:49
【问题描述】:

分类问题:

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

谢谢

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 投反对票的原因是什么?你是在连续投票给我吗?
    • @H2C03 今天好像有人不喜欢你。
    • @FilipRadelic 是的,对我来说也是如此……无论如何,我还是将我的 amswers 标记为 mod 注意。也感谢那些补偿它的人。
    • +1 IMO SO 应该在投反对票时必须发表评论,甚至最好让用户决定投反对票是否合理,如果不合理则取消
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 2012-11-17
        • 2011-07-13
        • 2012-06-29
        • 2014-08-03
        • 1970-01-01
        • 1970-01-01
        • 2011-11-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多