You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

XCode10旧代码启动崩溃:NSInvalidArgumentException异常排查求助

解决MKStoreManager过度释放导致的启动崩溃问题

看起来你碰到了Xcode版本升级后典型的野指针+过度释放内存问题,我来帮你拆解分析,一步步解决:

先看懂报错信息背后的原因

你的报错分两部分,其实是同一个问题的连锁反应:

  1. 第一行报错 objc[680]: MKStoreManager object 0x281ecd020 overreleased while already deallocating
    这说明你的MKStoreManager单例实例被过度释放了——在它已经进入dealloc流程的时候,还收到了额外的释放消息,导致内存被系统回收。
  2. 第二行报错 -[_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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:02:09