首页 > 解决方案 > iOS EXC_BAD_ACCESS (code=1, address=0x0) 仅在 iOS 9 上崩溃

问题描述

我正在与其他团队一起制作应用程序,其他团队为我部署了一个框架。我将这些框架导入我的应用程序。

我尝试使用我的测试设备进行构建,它们是 iPhone 8 Plus(iOS 11)、iPhone 7 Plus(iOS 10)、两个 iPhone X (iOS 11)、iPhone Pro (iOS 11) 以上设备也可以正常工作。

但不适用于 iPhone 5c (iOS 9.3) iPad Mini 1 (iOS 9.3) 。它们仅适用于第一次使用 Xcode 构建,断开电缆后,第二次打开应用程序,它总是在启动图像后崩溃。

appdelegate.h 中的代码

@property (strong, nonatomic) FrameworkViewController *InfoVC;
@property (strong, nonatomic) MyNavigationViewController *conNav;

我的 appdelegate.m 中的初始化代码

NSBundle *myframeworkBundle = [NSBundle bundleForClass:[FrameworkManager class]];
InfoVC = [[FrameworkViewController alloc]initWithNibName:@"FrameworkViewController" bundle:myframeworkBundle];
conNav = [[MyNavigationViewController alloc] initWithRootViewController:InfoVC];
InfoVC.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc]
                                                initWithImage:[UIImage imageNamed:@"leftMenu_icon.png"] style:UIBarButtonItemStylePlain
                                                target:self
                                                action:@selector(myfunction:)];
conNav.tabBarItem.title=@"TAP_Information";
conNav.tabBarItem.image=[UIImage imageNamed:@"tab_info.png"];

我添加了一个断点并让那些 iPhone 5c 和 Mini 1 的 InfoVC 返回 nil。但是那些工作设备将显示一个地址。而且我认为 infoVC 是 nil 并且我尝试将 leftbarButtonItem 设置为 nil 对象以导致崩溃,但是如何解决这个问题?我尝试添加一个 main_queue 似乎行不通。

- - - - - - -更新 - - - - - - -

我尝试添加一些 NSLog 来查看那些 nil 对象,我发现 NSlog 可以打印出一个有效的地址,nil 是应用程序崩溃的原因。现在它仅在 iOS 9 设备上随机崩溃。所有的崩溃都是 EXC_BAD_ACCESS(代码=1,地址=0x0)。

设备错误日志 1 设备错误日志 2

标签: iosobjective-c

解决方案


如果您已获得.framework文件,我建议您使用以下功能之一搜索您的 NSBundle:

+ (NSBundle *)bundleWithIdentifier:(NSString *)identifier

+ (instancetype)bundleWithPath:(NSString *)path

文档中所述:

框架和插件通常使用此方法在运行时定位它们自己的包。此方法可能比尝试使用 bundleForClass: 方法定位捆绑包更有效。但是,如果对具有指定标识符的已加载和缓存的捆绑包的初始查找失败,则此方法会使用可能耗时的试探法来尝试定位捆绑包。作为优化,您可以使用 bundleWithPath: 或 bundleWithURL: 方法来避免文件系统遍历。


推荐阅读