【问题标题】:On device only - Unrecognized selector sent to class仅在设备上 - 发送到班级的无法识别的选择器
【发布时间】:2014-10-02 12:44:26
【问题描述】:

我遇到了一个问题,我originally 认为这与我的 Xamarin 绑定有关。但是,我现在制作了一个示例 Objective-C 应用程序,以从等式中删除 Xamarin,我也遇到了同样的问题。我创建了一个带有以下标头的库:

#import <Foundation/Foundation.h>


@interface StarIOFunctions : NSObject {

}

+ (NSMutableData *) GetDataToSendToPrinter:(UIImage *)image maxWidth:(int)maxWidth drawerKick:(BOOL)drawerKick compressionEnable:(BOOL)compressionEnable;

@end

点击一个按钮就可以从我的应用程序中调用它:

- (IBAction)DevButton_TouchUpInside:(id)sender {

    UIImage *imageToPrint = [UIImage imageNamed:@"image1.png"];

    NSMutableData *commandsToPrint = [StarIOFunctions GetDataToSendToPrinter:imageToPrint maxWidth:100 drawerKick:YES compressionEnable:YES];

}

在模拟器中一切正常,但当我部署到设备时崩溃:

2014-10-02 13:34:04.821 StarIO SDK[449:95479] +[StarIOFunctions GetDataToSendToPrinter:maxWidth:drawerKick:compressionEnable:]: unrecognized selector sent to class 0x13dddc
2014-10-02 13:34:04.825 StarIO SDK[449:95479] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '+[StarIOFunctions GetDataToSendToPrinter:maxWidth:drawerKick:compressionEnable:]: unrecognized selector sent to class 0x13dddc'
*** First throw call stack:
(0x24b2df87 0x324cac77 0x24b33299 0x24b31259 0x24a62d68 0xce213 0x27fdd497 0x27fdd439 0x27fc804d 0x27fdce69 0x27fdcb43 0x27fd6451 0x27faccc5 0x28220513 0x27fab707 0x24af4807 0x24af3c1b 0x24af2299 0x24a3fdb1 0x24a3fbc3 0x2bd74051 0x2800ba31 0x93a3f 0x93040)
libc++abi.dylib: terminating with uncaught exception of type NSException
(lldb) 

有人提到设备和模拟器在大小写方面的区别,但文件名肯定是小写的:

是什么导致我的应用崩溃?

【问题讨论】:

  • 尝试添加异常断点,看看到底哪里出了问题
  • StarIOFunctions 类是否在您与 iOS 应用程序链接的静态库中实现?如果是这样,您需要将-ObjC 链接器标志添加到您的项目设置中。编译后,该方法似乎不存在于应用程序二进制文件中。
  • 中断了我用 2014-10-02 13:59:37.408 StarIO SDK[473:99349] +[StarIOFunctions GetDataToSendToPrinter:maxWidth:drawerKick:compressionEnable:] 调用 GetDataToSendToPrinter 的行:无法识别的选择器发送到类 0x121ddc (lldb)
  • 独立于您的问题,您应该查看 Cocoa 命名约定。方法名称应以与变量相同的小写字母开头。类和 ENUMS 应该以大写开头。编码约定对每个人都有帮助,所以坚持它们总是好的,这将特别有助于我们更好地理解您的代码。

标签: ios objective-c


【解决方案1】:

如果您的 StarIOFunctions 类在您与 iOS 应用程序链接的静态库中实现,您需要将 -ObjC 链接器标志添加到您的项目设置中。编译后,该方法似乎不存在于应用程序二进制文件中。 This article 描述了如何添加链接器标志。

【讨论】:

  • 添加它然后阻止我构建,错误:clang:错误:链接器命令失败,退出代码为 1(使用 -v 查看调用)
  • 单击左窗格中的错误。它应该会显示完整的错误文本。
  • 我已经设法解决了这个问题 - 它与另一个库有关,现在已修复。使用 -ObjC 集时,应用程序仍然会因完全相同的错误而崩溃。
  • @Joseph 也尝试添加-all_load。有时我发现自己出于某种原因不得不这样做。
  • 确保在 iOS 应用目标上设置这两个标志,而不是库本身。
猜你喜欢
  • 2011-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多