在应用程序购买/视图控制器崩溃:消息发送到解除分配的实例

我的视图控制器上有一个button,显示我的应用内购买商店。

storeSinglePlayer *ssp = [[storeSinglePlayer alloc] initWithNibName:@"storeSinglePlayer" bundle:nil]; //Animation Code CATransition* transition = [CATransition animation]; transition.duration = 0.5; transition.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]; transition.type = kCATransitionPush; transition.subtype = kCATransitionFromTop; [self.navigationController.view.layer addAnimation:transition forKey:nil]; [self.navigationController pushViewController:ssp animated:NO]; 

导航控制器成功将该商店推到屏幕上。 商店有一个后退button,执行以下代码:

 [self.request cancel]; self.request.delegate = nil; self.request = nil; [[SKPaymentQueue defaultQueue] removeTransactionObserver:self]; CATransition* transition = [CATransition animation]; transition.duration = 0.5; transition.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]; transition.type = kCATransitionPush; transition.subtype = kCATransitionFromBottom; [self.navigationController.view.layer addAnimation:transition forKey:nil]; [self.navigationController popViewControllerAnimated:NO]; 

这也成功执行。 但是,如果我现在单击button再次显示商店视图控制器,我得到的消息:

 -[storeSinglePlayer respondsToSelector:]: message sent to deallocated instance 0xd642df0 

这确实是一个非常有名的问题。 正如你会注意到在上面的代码中,我已经纳入了我遇到的各种post在stackoverflow的build议。 以下代码已经实现:

 [self.request cancel]; self.request.delegate = nil; self.request = nil; [[SKPaymentQueue defaultQueue] removeTransactionObserver:self]; 

另外我有我的财产和相应的综合设置为:

 @property (nonatomic, strong) SKProductsRequest *request; @synthesize request = _request; 

我不知道为什么它崩溃了!

PS:项目启用了ARC。

在ARC发布之后,有些东西正在调用你的ssp。 您发布的代码没有说明发生的情况。

最有可能解决这个问题的一件事就是在你的类声明中保留对成员variables+属性的引用,而不是每次单击button时创build一个新的。 当你的第一个viewcontroller加载并重用它时,只需要初始化它。

如果你想进一步调查,你可以尝试评论设置过渡的方块,看看它是否仍然崩溃。 也许导航控制器在ssp发布之后进行一些调用。

当一个消息被发送到一个释放的实例时,一个对象从内存中释放,并且您正试图再次使用它。 ARC必须释放对象,因为它自动检测到你不再需要它。 尝试添加以下之一到您的头文件。

 @property (nonatomic, strong) storeSinglePlayer *ssp; 

要么

 storeSinglePlayer *__strong ssp; 

上面的重要词汇是强大的 。 它告诉ARC你想保留这个对象以备后用。

我得到了我搞乱的地方。 我正在处理多个旋转使用下面的代码:

 [[NSBundle mainBundle] loadNibNamed:[NSString stringWithFormat:@"storeSinglePlayerLandscape"] owner:self options:nil]; [self viewDidLoad]; 

我现在意识到,这不是最好的做法,因为它多次调用viewDidLoad。 不过,这不是问题的原因。 它正常工作,当商店只显示几次,并返回到以前的视图控制器。 但是说10-15次之后,会有太多的请求返回产品,从而发送错误消息“发送到释放实例”。

我注释掉了代码,现在它工作正常。

我知道,这是一个非常典型的问题,大多数用户可能不会面对。 但为了以防万一,你用了像我这样的一些不好的代码,可能是这个信息有效!