0

我有一个在 Mac 市场上销售的应用程序,这个应用程序一直运行顺利——直到客户开始在 Mavericks 下运行它。

归结为我从客户那里得到的例外情况:

2013 年 11 月 7 日上午 8:54:17.841 MyApp[65256]:-[Property watts Per Square MeterStringValue]:无法识别的选择器发送到实例 0x7fa66c80a760

现在,很明显“watts Per Square MeterStringValue”不是一个有效的选择器,但让我解释一下。

我在 NSString 上有一个类别,它有一系列方法可以执行不同的操作,例如从字符串中删除空格,或者将字符串的第一个字符设置为小写等。这个类别存在于我嵌入到我的应用程序中的框架中。

该类别中的一种特殊方法是“bindString”,它将字符串转换为可绑定的驼峰式字符串。所以:

[@“这是一个时髦的字符串”bindString]

会产生:

“thisIsAFunkyString”

在 Mavericks 下的我的应用程序中似乎发生的事情是 category 方法并不总是被调用,即使它在源代码中被引用。这种行为纯粹是随机的。在应用程序运行时,有时会调用它,有时不会。如果不是,则会发生上述异常。

这只会在小牛队下发生。相同的二进制文件在 Mountain Lion 和 Lion 下完美运行。

现在我想知道为什么会这样。这是 Mavericks 下的 Obj-C 运行时问题吗?是 Xcode 5.0.1 编译器问题吗?我不知道,但这很奇怪,它把我逼疯了。

我几乎什么都试过了。接下来我要尝试的是将类别 .m 和 .h 从框架中提取出来,并将其直接放入应用程序项目中。

有没有人在小牛队看到过这样的事情?

4

1 回答 1

2

将类别挂在 NSString 上通常是个坏主意。特别是当您的方法名称没有前缀时。如果您确实有一个bindString在 上的类别中命名的方法NSString,那么您可能会与 Apple 框架中某个类别中提供的方法发生冲突。当两个类别实现相同的选择器时,哪个“获胜”是不确定的。

请记住,这NSString是一个类集群。因此,如果该方法与子类上的方法发生冲突,您还会看到奇怪的行为,因为您的类别的方法可能并不总是被调用。

至少,在系统类的类别中的所有方法上加上前缀。更好的是,不要扩展系统类;把你的方法放在他们自己的类中。

于 2013-11-08T16:58:57.713 回答