ios - objective-c 中的方法在任何地方都有效

标签 ios objective-c objective-c-category method-swizzling

我创建了一个方法 swizzled UITextField 的类别,它的名字像 UITextField+MaxLength,我实现了 +load 方法来做 swizzled,但我没有在前缀头文件或其他文件中导入它,只是在 SomeViewController 中导入它。

我认为 swizzled 应该只在 SomeViewController 中工作,但为什么在每个 UITextField 甚至 UISearchBar 中调用 swizzled 方法?当我运行应用程序时调用 +load 方法?

编辑

我想我需要指出为什么我使用 swizzled,因为我想使用 KVO 来观察文本的变化,所以我调整了 setText 并关联了一个属性 NSNumber 命名为 displayLength,所以,如果我不使用 KVO,我可以删除这个类别的混合部分,我可以将子字符串剪切到特定的最大长度。

最佳答案

Swizzling 发生在运行时;如果您执行调配,它会真正改变该类方法的实现。就像您将代码更改为 UITextField 一样。

这就是为什么方法调配是如此罕见和危险的事情。如果您只想更改 UITextField 的特定实例,子类化(或者,从您的类别标题猜测您的意图,使用委托(delegate))。

关于ios - objective-c 中的方法在任何地方都有效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39274882/

相关文章:

ios - Swift 日期格式化仅在特定日期失败

objective-c - dispatch_sync() 总是在主线程中执行 block

objective-c - 使用运行循环覆盖 main.m 但仍然进入 NSApplicationMain 调用?

iphone - 在 View Controller 之间传递/共享数据的方式有多少

ios - 在 dealloc 之前观察并删除类别中的 NSNotification

ios - 在UIView类别中创建UIBezierPath。没有显示

ios - 无法分配给属性 : 'item' is a 'let' constant (Swift 4)

ios - 将图像复制到 xcode

ios - 为什么TableView、TableCell不出现?