当应用程序在 Mavericks 下运行时,类别方法并不总是被调用

Posted

技术标签:

【中文标题】当应用程序在 Mavericks 下运行时,类别方法并不总是被调用【英文标题】:Category method not always called when app runs under Mavericks 【发布时间】:2013-11-08 15:44:19 【问题描述】:

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

归结为我从客户那里得到的这样的例外:

11/7/13 8:54:17.841 AM MyApp[65256]:-[Property watts Per Square MeterStringValue]:无法识别的选择器发送到实例 0x7fa66c80a760

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

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

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

[@"This is a Funky String" bindString]

会产生:

“thisIsAFunkyString”

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

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

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

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

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

【问题讨论】:

一个重现问题的测试用例会很好。或者至少是您如何使用该类别的示例? 【参考方案1】:

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

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

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

【讨论】:

以上是关于当应用程序在 Mavericks 下运行时,类别方法并不总是被调用的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL 4.1 不适用于 Mavericks

在 OS X 10.9 (Mavericks) 上安装 Java

使用 SQLite 数据库的 Mac 应用程序在 10.9 Mavericks 中创建了三个数据库

Android Studio 无法在 Mac OSX (Mavericks) 上加载 JVM

代码符号 cmd 通过 Mavericks 10.9 上的原始文件更改应用程序的快捷方式

Applescript 在 Mavericks 上通过 ssh 启动时失败并出现错误 (-600)