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

时间:2013-11-08 15:44:19

标签: objective-c macos cocoa osx-mavericks

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

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

  

11/7/13 8:54:17.841 AM MyApp [65256]: - [属性瓦特每平方米MeterStringValue]:无法识别的选择器发送到实例0x7fa66c80a760

现在,“瓦特每平方米MeterStringValue”显然不是一个有效的选择器,但让我解释一下。

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

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

  

[@“这是一个Funky String”bindString]

会产生:

  

“thisIsAFunkyString”

我在小牛队的应用程序中发生的事情是,即使在源中引用了类别方法,也不会总是调用类别方法。这种行为纯粹是随机的。当应用程序运行时,有时它会被调用,有时不会被调用。如果不是,就会发生上述异常。

这只发生在小牛队。同样的二进制文件在Mountain Lion和Lion下完美无缺。

现在我想知道为什么会这样。它是Mavericks下的Obj-C运行时问题吗?它是Xcode 5.0.1编译器问题吗?我不知道,但它只是很奇怪,而且它正在把我推到墙上。

我已经尝试了一切。接下来我要尝试的是将类别.m和.h从框架中拉出来并将其直接放入应用程序项目中。

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

1 个答案:

答案 0 :(得分:2)

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

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

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