XCode10旧代码启动崩溃:NSInvalidArgumentException异常排查求助
解决MKStoreManager过度释放导致的启动崩溃问题
看起来你碰到了Xcode版本升级后典型的野指针+过度释放内存问题,我来帮你拆解分析,一步步解决:
先看懂报错信息背后的原因
你的报错分两部分,其实是同一个问题的连锁反应:
- 第一行报错
objc[680]: MKStoreManager object 0x281ecd020 overreleased while already deallocating
这说明你的MKStoreManager单例实例被过度释放了——在它已经进入dealloc流程的时候,还收到了额外的释放消息,导致内存被系统回收。 - 第二行报错
-[_UIBackgroundTaskInfo setStoreObserver:]: unrecognized selector sent to instance 0x281ecd020
同一个内存地址0x281ecd020现在变成了_UIBackgroundTaskInfo对象,说明MKStoreManager被释放后,这块内存被系统复用了,之后有代码还在给这个已经失效的指针发消息,直接触发崩溃。
具体排查和修复步骤
1. 检查MKStoreManager的单例实现是否正确
旧项目的单例写法可能在Xcode10的ARC环境下存在漏洞,导致单例被意外释放。确保你的单例是静态强引用的标准写法:
+ (instancetype)sharedManager { static MKStoreManager *sharedInstance = nil; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ sharedInstance = [[self alloc] init]; }); return sharedInstance; }
避免使用__weak修饰静态实例,也不要在其他地方手动释放这个单例。
2. 修复SKProductsRequest的代理生命周期问题
在requestProductData里,你把SKProductsRequest作为局部变量创建,并且把self设为代理。如果MKStoreManager被提前释放,后台运行的request会给已经失效的对象发消息,直接触发崩溃。
修复方法:
- 把
SKProductsRequest作为MKStoreManager的强引用属性保存:// 在MKStoreManager.h中添加属性声明 @property (nonatomic, strong) SKProductsRequest *productsRequest; // 在requestProductData中修改代码 self.productsRequest = [[SKProductsRequest alloc] initWithProductIdentifiers:[NSSet setWithObjects:foodIAP, vanityIAP, dressIAP, iceIAP, allIAP, nil]]; self.productsRequest.delegate = self; [self.productsRequest start]; - 在
MKStoreManager的dealloc方法中主动取消请求并清空代理:- (void)dealloc { if (self.productsRequest) { [self.productsRequest cancel]; self.productsRequest.delegate = nil; } }
3. 检查ARC编译设置是否正确
旧项目升级时,部分文件可能被错误标记为MRC(手动引用计数),导致内存管理混乱:
- 选中你的项目目标 → 进入
Build Phases→Compile Sources - 找到
MKStoreManager.mm和AppController.mm,查看它们的Compiler Flags - 如果有
-fno-objc-arc标记,说明这两个文件是MRC模式,而你的代码可能是ARC写法。如果不需要MRC,直接删除这个标记;如果必须用MRC,要给sharedManager实例添加retain,避免被提前释放。
4. 启用僵尸对象调试定位问题
Xcode的僵尸对象工具可以帮你更精准追踪内存问题:
- 打开
Edit Scheme→Run→Diagnostics - 勾选
Zombie Objects选项 - 重新运行App,崩溃时会显示具体是哪个对象收到了无效消息,以及消息的调用栈,帮你快速定位问题根源。
5. 检查MKStoreKit版本兼容性
旧版本的MKStoreKit可能和Xcode10的UIKit存在冲突,导致setStoreObserver:这类方法的调用出现问题。建议更新MKStoreKit到最新兼容版本,或者考虑自己实现IAP的核心逻辑,避免依赖过时的第三方库。
内容的提问来源于stack exchange,提问作者Sean
相关产品推荐
相关产品推荐

