美文网首页
苹果内购内存错误调试

苹果内购内存错误调试

作者: Alex_陈 | 来源:发表于2018-01-15 14:38 被阅读0次

苹果规定,虚拟商品必须采用内购形式购买。

在接入内购过程中,遇到一个内存泄漏问题。如下图,

具体操作方式:点击获取商品列表页面,在商品列表没有加载完毕时,返回上一级页面,此时闪退。报错如上图。

解决方式:

分析:在此引入僵尸对象概念,所谓僵尸对象,是用于捕捉内存错误的调试功能。

通常情况下,当引用计数降为0时对象会立即被释放,但这使调试变得困难。如果开启了僵尸对象,那么对象就不会立即释放内存,而是被标记为僵尸。任何试图对其进行访问的行为都会被日志记录,因而你可以在对象的生命周期中跟踪对象在代码中被使用的位置。

NSZombieEnabled是一个环境变量,可以控制Core Foundation的运行时是否将使用僵尸对象。不应长期保留NSZombieEnabled,因为默认情况下是不会有对象被真正析构,这会导致应用使用大量的内存。特别说明:在发布的构建包中一定要禁用NSZombieEnabled。

设置NSZombieEnabled环境变量,需要进入Product->Scheme->Edit Scheme。选择左侧的Run,然后再右侧选取Diagnostics标签页。选中Enable Zombie Objects 选项。

设置完成后,报错如下:

通过日志可以清晰地确认是哪个类发生了内存泄漏。于是,追踪到这个类,发现注册的通知,在最后dealloc中已经移除了。同时根据断点,发现在返回上一级后,代理的方法,还在执行。故而想到试着把代理置为nil。

因而最终解决方式是:

SKProductsRequest *request;

- (void)dealloc {

    [[SKPaymentQueue defaultQueue] removeTransactionObserver:self];

    request.delegate = nil;

}

注:在进行必要清理时一定要移除观察者(具体来说,移除对通知的注册),解除回调(具体来说,将强引用的委托设置为nil)。

相关文章

  • 苹果内购内存错误调试

    苹果规定,虚拟商品必须采用内购形式购买。 在接入内购过程中,遇到一个内存泄漏问题。如下图, 具体操作方式:点击获取...

  • iOS内购掉单处理教程

    1.前言 最近公司的项目需要接入苹果内购支付。看了下项目里面,内购这个模块的功能之前就已经写好了,然后就跟后台调试...

  • iOS 11 如何测试苹果商店内内购

    如何测试苹果商店内内购? 有什么现象? 0、苹果商店的内购,用户在苹果商店中选择内购产品时,如果用户已经安装好此应...

  • 苹果内购和Apple Pay 的区别

    苹果内购 和 Apple Pay 的区别 关注苹果支付和内购也是从苹果发布打赏功能必须走“内购”流程后,引发微信以...

  • 苹果内购流程

    苹果内购流程

  • 苹果内购

    先附上一篇介绍怎么填写协议、税务和银行业务的文章 本文主要介绍内购代码部分 首先导入StoreKit/StoreK...

  • 苹果内购

    代码经过验证,但是这里只提供了iap相关的代码,有依赖其他的代码自行删减 直接上代码

  • 苹果内购

    内购简介: 在APP里面购买一些东西的时候,必须要使用苹果的支付方式进行购买.如果你的APP当中销售的商品,跟AP...

  • 苹果内购

    1.登录开发者中心[开发者中心链接](https://developer.apple.com) 2.点击iTune...

  • 苹果内购

    http://www.jianshu.com/p/e9ae4cece800

网友评论

      本文标题:苹果内购内存错误调试

      本文链接:https://www.haomeiwen.com/subject/vqnroxtx.html