ios – 在NSObject上使用类别提供默认协议实现有什么问题?

前端之家收集整理的这篇文章主要介绍了ios – 在NSObject上使用类别提供默认协议实现有什么问题?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我一直在寻找一种方法来使用可选的协议方法并拥有干净的代码.换一种说法:
1:没有respondsToSelector:调用我的代码
2.应该适用于任何方法签名,因此NSObject上的类别方法进行检查并调用performSelector:out(并且NSInvocation与ARC合作有问题)
3:这个 solution,IMO,假装是普遍的但具有1的所有缺点

我最终提出了这个想法:

@H_301_7@@protocol MyProtocol <NSObject> @optional -(void)optionalMethod; @end @interface ClassA : NSObject <MyProtocol> @end @implementation ClassA -(void)optionalMethod{ NSLog(@"ClassA implements optionalMethod"); } @end @interface ClassB : NSObject <MyProtocol> @end @implementation ClassB //classB does not implement optionalMethod @end @interface NSObject (DefaultMyProtocolImplementation) -(void)optionalMethod; @end @implementation NSObject (DefaultMyProtocolImplementation) -(void)optionalMethod{ NSLog(@"%@ does not implement optionalMethod",NSStringFromClass([self class])); } @end

它似乎有用,即:

@H_301_7@... ClassA *objA = [[ClassA alloc] init]; ClassB *objB = [[ClassB alloc] init]; [objA optionalMethod]; //prints "ClassA implements optionalMethod" [objB optionalMethod]; //prints "ClassB does not implement optionalMethod"

虽然很多地方在网上讨论这个问题,但我没有偶然发现这个解决方案,这让我觉得它有些不对劲 – 一些重大案例,它会失败,或者是不可预测的.

我应该这样做,还是我的担忧有效?

解决方法

添加到现有系统类的方法应该以某种方式作为前缀.即exec_myMethod或exec_doSomethingToThis:所以,你的解决方案违反了这一点.

除此之外,它还意味着一个类不能选择退出任何默认的@optional方法的行为(基本上没什么,因为你的默认实现真的应该是无操作).

因此,总的来说,除了违反应用添加前缀规则之外,提供默认实现以通过类别向现有类添加方法,没有什么可怕的错误.但这不是一个严格的规则.

另一个缺点是您正在污染方法命名空间.在开发过程中这将是一个缺点,因为Xcode将编写完成所有方法代码,通过简单地不暴露声明(不需要公开)就可以轻松避免.在运行时,这意味着respondsToSelector:对这些方法没用,但这有点像设计.

仍然……它闻到了这个旧计时器的代码嗅觉中心.

原文链接:https://www.f2er.com/iOS/334338.html

猜你在找的iOS相关文章