2012-08-15 54 views
1

消息我有我的呈現在應用商店購買我的視圖控制器上的按鈕。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。

+0

確保你沒有釋放它兩次..?或者你使用弧..? – 2012-08-15 11:56:06

+1

在引發異常時查看堆棧可能很有用。如果你自己沒有調用'respondsToSelector:',那麼如果'ssp'被用作某種代理的話可能會發生。 – 2012-08-15 11:57:15

+0

你有個例外是非常普遍的例外; **你需要使用調試器來設置一個斷點來停止拋出的異常**然後你可以看看調用堆棧(如Phillip Mills所建議的),並找出你的代碼正在做什麼來觸發異常。 *然後*我們將有足夠的信息來解決這個問題。 – benzado 2012-08-15 17:09:34

回答

0

我得到了我搞亂的地方。我用下面的代碼處理多個旋轉:

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

[self viewDidLoad]; 

我現在意識到,這不是最好的做法,因爲它調用viewDidLoad中多次。不過,這不是問題的原因。當商店只顯示幾次並返回到前一個視圖控制器時,它工作正常。但是,在10-15次之後,有太多請求會與產品一起返回,因此會發送錯誤消息「發送到釋放實例的消息」。

我註釋掉了代碼,現在它工作正常。

我知道,這是一個非常典型的問題,大多數用戶可能不會面對。但爲了以防萬一,你使用了像我這樣的一些不好的代碼,可能是這個信息起作用!

0

當消息被髮送到一個釋放的實例,對象從內存中釋放和你正試圖再次使用它。 ARC必須釋放該對象,因爲它會自動檢測到您不再需要該對象。嘗試添加下列之一到您的頭文件。

@property (nonatomic, strong) storeSinglePlayer *ssp; 

storeSinglePlayer *__strong ssp; 

上面的重要的詞是。它告訴ARC你想保留這個對象以備後用。

+0

我試過這個,問題依然存在。 – mvb 2012-08-16 17:15:47

+0

謝謝,問題解決了。 – mvb 2012-08-16 18:28:14

2

東西在呼喚你的SSP它已被ARC釋放之後。您發佈的代碼並未清楚說明發生的情況。最有可能會解決這個問題

有一件事是保持一個成員變量+屬性爲您的SSP的引用您的類聲明,而不是單擊該按鈕每次createing一個新的。只需在您的第一個視圖控制器加載並重新使用它時初始化一次。

如果您想進一步瞭解詳情,您可以嘗試註釋掉塊設立過渡,看看它是否仍然崩潰。也許導航控制器在ssp發佈後進行一些調用。

+0

感謝您的回覆。事實上,我可以縮小真正的問題,應用所有可能的解決方案。 – mvb 2012-08-16 18:27:53