消息我有我的呈現在應用商店購買我的視圖控制器上的按鈕。In App Purchase的/ - 視圖 - 控制器崩潰:發送到釋放實例
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];
導航控制器成功地將該商店推到屏幕上。該商店有一個後退按鈕,執行以下代碼:
[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];
這也執行成功。但是,如果我現在點擊按鈕再次顯示商店視圖控制器,我得到的消息:
-[storeSinglePlayer respondsToSelector:]: message sent to deallocated instance 0xd642df0
這是一個非常著名的問題確實。正如你在上面的代碼中注意到的那樣,我已經將我在stackoverflow上遇到的各種帖子的建議合併在一起。下面的代碼已經實現:
[self.request cancel];
self.request.delegate = nil;
self.request = nil;
[[SKPaymentQueue defaultQueue] removeTransactionObserver:self];
我也有我的財產和相應的合成設置爲:
@property (nonatomic, strong) SKProductsRequest *request;
@synthesize request = _request;
我不知道,爲什麼會崩潰!
P.S:項目已啓用ARC。
確保你沒有釋放它兩次..?或者你使用弧..? – 2012-08-15 11:56:06
在引發異常時查看堆棧可能很有用。如果你自己沒有調用'respondsToSelector:',那麼如果'ssp'被用作某種代理的話可能會發生。 – 2012-08-15 11:57:15
你有個例外是非常普遍的例外; **你需要使用調試器來設置一個斷點來停止拋出的異常**然後你可以看看調用堆棧(如Phillip Mills所建議的),並找出你的代碼正在做什麼來觸發異常。 *然後*我們將有足夠的信息來解決這個問題。 – benzado 2012-08-15 17:09:34