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

标签 objective-c macos cocoa osx-mavericks

我有一个在 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/

相关文章:

ios - 无法解析 obj c 中的 JSON 文件

dlopen - Mac 上的 RTLD_FIRST 是否完成 Linux 上的 RTLD_DEEP_BIND 的工作?

bash - Platypus 的替代品(它构建了一个 mac .app,当用户双击它时运行脚本),它在 Linux 上运行?

objective-c - AppleScript:调用 Shell 脚本的处理程序结果为 "Unrecognized function fileHandleForReading"

macos - 检测 Safari 何时启动

objective-c - 如何使用新的 iOS SDK 3 扩展访问 token ?

objective-c - 如何在 xcode 之外运行 objective-c 控制台应用程序(带有库)?

objective-c - 如何让 NSNumberFormatter 显示无穷大符号 (∞)?

objective-c - 使用 UIViewController 作为协议(protocol)

swift - macOS 应用程序上的 CLLocationManager 不要求位置