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

时间:2016-09-01 14:56:28

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

我为方法调整UITextField创建了一个类别,它的名称类似于UITextField+MaxLength,我实现了+load方法来进行调整,但我没有在前缀标题或其他方法中导入它文件,只需将其导入SomeViewController

我认为调整只应在SomeViewController中运行,但为什么每个UITextField甚至UISearchBar都会调用混合方法?并且在运行应用程序时调用+load方法?

修改

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

1 个答案:

答案 0 :(得分:2)

在运行时发生混乱;如果你执行一个混合,它真正改变了该类方法的实现。就像您将代码更改为UITextField一样。

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