我有一个在 Mac 市场上销售的应用程序,并且该应用程序一直运行顺利 - 直到客户开始在 Mavericks 下运行它。
归结起来就是我从客户那里得到的这样的异常(exception)情况:
11/7/13 8:54:17.841 AM MyApp[65256]: -[Property watts Per Square MeterStringValue]: unrecognized selector sent to instance 0x7fa66c80a760
现在,很明显“watts Per Square MeterStringValue”不是有效的选择器,但让我解释一下。
我在 NSString 上有一个类别,它有一系列方法,可以执行不同的操作,例如从字符串中删除空格,或将字符串的第一个字符设置为小写等。此类别存在于我嵌入到我的应用程序中的框架中.
该类别中的一个特殊方法是“bindString”,它将字符串转换为可绑定(bind)的驼峰式字符串。所以:
[@"This is a Funky String" bindString]
会产生:
"thisIsAFunkyString"
在 Mavericks 下的我的应用程序中似乎发生的情况是,类别方法并不总是被调用,即使在源代码中引用了它。这种行为纯粹是随机的。当应用程序运行时,有时会被调用,有时不会。如果不是,则会出现上述异常。
这种情况只发生在 Mavericks 。相同的二进制文件在 Mountain Lion 和 Lion 下完美运行。
现在我想知道这是为什么。是 Mavericks 下的 Obj-C 运行时问题吗?是 Xcode 5.0.1 编译器问题吗?我不知道,但这实在是太奇怪了,它让我抓狂。
我已经尝试了几乎所有的方法。接下来我要尝试的是将类别 .m 和 .h 从框架中拉出,并将其直接放入应用程序项目中。
有人在 Mavericks 见过这样的事情吗?
最佳答案
将类别卡在 NSString 之外通常是一个坏主意。特别是当你的方法名称没有前缀时。如果您在 NSString
的类别中确实有一个名为 bindString
的方法,那么您可能会与 Apple 框架中某个类别中提供的方法发生冲突。当两个类别实现相同的选择器时,哪一个“获胜”是不确定的。
请记住,NSString
是一个类簇。因此,如果该方法与子类上的方法发生冲突,您还会看到奇怪的行为,因为您的类别的方法可能并不总是被调用。
至少,在系统类的类别中的所有方法上添加前缀。更好的是,不要扩展系统类;将您的方法放在自己的类中。
关于objective-c - 当应用程序在 Mavericks 下运行时,并不总是调用类别方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19863004/