分类问题:
我想在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
}
感谢
答案 0 :(得分:6)
代码按原样无效,因为您正在使用[super query]
- 这并不能完全按照您的预期执行操作。类别不是超类。这里[super query]
将尝试调用- [NSObject query]
- BOOM无法识别的选择器错误。如果你使用类别扩展一个类,你将无法调用原始方法 - 如果你不需要这个功能,那么使用类别就没问题了,但是,如果你确实需要它,你应该考虑子类化,(甚至更好的基础对象组合!)或使用Objective-C运行时执行method swizzling - 这样你就可以访问该方法的原始实现。
答案 1 :(得分:2)
您不应使用类别来覆盖现有方法。 类别用于增强类行为,而不对其进行子类化。 (虽然我认为你可以覆盖它但是苹果强烈反对)
答案 2 :(得分:2)
添加自己的方法,以免与苹果sdk发生冲突。考虑一下贵公司中使用此类别的人:他做的第一件事就是查看开发人员库,了解这种方法的作用。
导入您的类别后,它不再执行应该执行的操作了。 Apple不推荐这个!