Objective-C类别的安全性如何?

Cas*_*ash 4 objective-c

Objective-C类别非常有用,但这种功能存在一些问题.这些基本上有两种我知道的形式:

  • 尝试添加相同便捷方法的两个类别.在这种情况下,未定义使用哪一个.如果你小心 - 不添加太多方法或使用特别常见的方法名称 - 第一个问题几乎不应该是一个问题.
  • 由与类别冲突的编写器添加到类的新方法.在这种情况下,类别会覆盖类方法.由于课程可能不在我的控制之下,我更担心这个问题.

反向移植应该是相当安全的,但实现接口或添加便利方法似乎更危险.我知道Cocoa似乎将它用于方便方法,但是基类再次受到控制.我想也许他们只是使用类别来减少依赖 - 所以String类可以有方便的方法在Cocoa中工作,但是如果你不使用Cocoa,它就不会被引入.

那么,类别/保护它们的安全指南有多安全?

Col*_*ett 6

通常,在扩展不受您控制的代码(例如Foundation)时,传统的方法名称使用前缀或后缀来避免这些类型的冲突.

Peter Hosey在主线程类别上的表演示例:

@interface NSObject (PRHPerformOnMainThread)
- (id) performOnMainThread_PRH;
@end
Run Code Online (Sandbox Code Playgroud)

这不是最美丽的解决方案,但如果你担心脆弱,这是一个好主意.