iPhone - SKProductsRequest和"发送到解除分配的实例的消息"

Mar*_*cin 5 iphone

我在实施InAppPurchase方面遇到了麻烦.我的购买实现是在模态视图控制器(AppUpgradeViewController)中,我从另一个模态视图中呈现.我是这样做的:

AppUpgradeViewController * appUpgradeViewController = [[AppUpgradeViewController alloc] init];
appUpgradeViewController.modalTransitionStyle = UIModalTransitionStyleCrossDissolve;
appUpgradeViewController.delegate = self;
[self presentModalViewController:appUpgradeViewController animated:YES];
[appUpgradeViewController release];
Run Code Online (Sandbox Code Playgroud)

然后,在我的升级视图中,我执行以下操作:

[[SKPaymentQueue defaultQueue] addTransactionObserver:self];
NSSet *productIdentifiers = [NSSet setWithObject:kInAppPurchaseProUpgradeProductId];
self.productsRequest = [[SKProductsRequest alloc] initWithProductIdentifiers:productIdentifiers];
self.productsRequest.delegate = self;
[productsRequest start];
Run Code Online (Sandbox Code Playgroud)

然后我实施了

- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response
Run Code Online (Sandbox Code Playgroud)

我在哪里:

[self.productsRequest release];
Run Code Online (Sandbox Code Playgroud)

然后我有其他所需的方法.

问题是当我显示模态时,并迅速解除它然后几秒后我在控制台上得到以下内容(我打开NSZombieEnabled):

*** -[AppUpgradeViewController respondsToSelector:]: message sent to deallocated instance 0x2e91f0
Run Code Online (Sandbox Code Playgroud)

我想这是产品请求的内容,但我不知道如何调试或修复它.似乎请求的答案是在它被解除(并且已经解除分配)之后才到达该控制器,但我不知道如何阻止它在解除/ dealloc之后接收消息.谢谢你的帮助!

H6.*_*H6. 9

我有同样的问题.不是模态视图,而是导航控制器堆栈上的推入视图.当我在加载产品信息之前快速导航回来时SKProductsRequest,它也会引发message sent to deallocated instance异常.我通过调用SKProductsRequest对象上的cancel方法(参见参考资料)解决了这个问题.

除此之外,我还将代表设置为nil.

这是我的产品要求:

NSSet *productIdentifiers = [NSSet setWithObject:@"MY_IDENTIFIER"];
SKProductsRequest *productsRequest = [[SKProductsRequest alloc] initWithProductIdentifiers:productIdentifiers];
productsRequest.delegate = self;
[productsRequest start];
Run Code Online (Sandbox Code Playgroud)

这就是我在dealloc方法中用来取消它的方法.

productsRequest.delegate = nil;
[productsRequest cancel];
productsRequest = nil;
Run Code Online (Sandbox Code Playgroud)

我也删除从观察者SKPaymentQueue的描述像这个答案另一个问题.

[[SKPaymentQueue defaultQueue] removeTransactionObserver:self];
Run Code Online (Sandbox Code Playgroud)


Dav*_*ave 0

是不是因为你这样做:

[appUpgradeViewController release]; 
Run Code Online (Sandbox Code Playgroud)

太早了?

尝试在您要分配它的任何类的 dealloc 方法中执行此操作。当然,前提是您不会多次分配它。这还需要您将声明移动到类头中。