当应用程序在 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 下运行时,类别方法并不总是被调用的主要内容,如果未能解决你的问题,请参考以下文章
在 OS X 10.9 (Mavericks) 上安装 Java
使用 SQLite 数据库的 Mac 应用程序在 10.9 Mavericks 中创建了三个数据库
Android Studio 无法在 Mac OSX (Mavericks) 上加载 JVM