簡體   English   中英

使用[類別保留]導致iOS App崩潰:消息已發送至已釋放實例

[英]Crashing iOS App with [Class retain]: message sent to deallocated instance

我正在構建我的應用程序,並且我是一個菜鳥,所以請原諒我缺乏信息!

我可以按照某些步驟使應用程序崩潰以進行重現,但有時是這樣。 當它崩潰時,它對main.m文件執行以下操作:

在此處輸入圖片說明

我已經用“ Throw”設置了一個異常斷點,並用“ Catch”分別設置了一個異常斷點,它實際上並沒有收集崩潰發生的任何特定代碼行。

我如何找出到底是什么引起了這個問題,或者是哪幾行代碼?

在此處輸入圖片說明

我正在iPhone 5s和6 Plus上進行測試,並且兩者均崩潰。

更新資料

我剛剛對此進行了一些測試,這是應用程序的工作流程。

我有一個UITableViewController (稱為“更多選項卡”)。 我單擊UIViewController (稱為主題),然后有一個按鈕。 我單擊該按鈕,它將調用UIAlertView 我單擊非取消按鈕,它將調用另一個UIViewController (稱為IAP)。 有一個帶有價格的UIButton和一個名為Cancel的UIBarButtonItem 如果單擊“取消”,它將關閉IAP UIViewController並返回到主題UIViewController。

IAPViewController上的UIButton從另一個名為Unlimited Entries的UIViewController動態調用價格。

如果在UIButton上加載價格之前單擊“取消”按鈕,我會注意到崩潰。

對於Zombies,崩潰控制台顯示:

2015-04-29 10:21:33.775 -[UnliimitedEntriesPurchase retain]: message sent to deallocated instance 0x174e4f4b0

IAPViewControllerviewDidLoad中,我具有:

[self.unlimitedEntriesPurchase validateProductIdentifiers];

我創建了一個屬性: @property (nonatomic, strong) UnliimitedEntriesPurchase *unlimitedEntriesPurchase; 我想這就是問題所在。

我希望這是有道理的,並有助於確定可能出現的問題。

在用戶向UIButton加載價格之前,用戶會來到IAP並單擊“取消”按鈕(關閉IAPViewController ),這種情況很少見。 但是,這是我要解決的問題,而不是附帶明顯的問題。

更新2

在我的IAPViewController中,我有一個自定義設置器:

- (UnliimitedEntriesPurchase *)unlimitedEntriesPurchase
{
    if (!_unlimitedEntriesPurchase)
    {
        _unlimitedEntriesPurchase = [[UnliimitedEntriesPurchase alloc] init];
        _unlimitedEntriesPurchase.delegate = self;
    }
    return _unlimitedEntriesPurchase;
}

通過在AppDelegate中設置alloc和init,此處的if語句將不成立,因此永遠不會設置自定義委托。

最可能的原因是您要對已釋放的對象觸發操作,您必須這樣做:

產品--->配置文件--->僵屍(樂器)

然后檢查儀器工具中正在崩潰的對象是什么。

您可以在另一個地方重新分配對象,例如,我將向您展示如何在AppDelegate中重新分配該對象,首先您必須在AppDelegate.h中添加它

@property (nonatomic, strong) UnliimitedEntriesPurchase *unlimitedEntriesPurchase;
+ (AppDelegate*) sharedDelegate;

而且在您的AppDelegate.m中

+ (AppDelegate*) sharedDelegate {
   return (AppDelegate*)[UIApplication sharedApplication].delegate;
}

在視圖控制器中,您必須導入AppDelegate.h並像這樣分配對象

[AppDelegate sharedDelegate].unlimitedEntriesPurchase = self.unlimitedEntriesPurchase;

之后,您可以觸發所有unlimitedEntryPurchase方法,因為它永遠不會被釋放,如果有任何問題,您可以觸發[AppDelegate sharedDelegate] .unlimitedEntriesPurchase

解決方案非常簡單,但是您可以先回答以下兩個問題嗎?

  1. 為什么不使用ARC? 如果使用ARC而不是手動保留/釋放,則不會遇到此問題。

  2. 為什么要觸發另一個視圖控制器(UnlimitedPriceEntries)來計算價格。 ViewControllers不應用於業務邏輯。 相反,您應該編寫另一個NSObject類來進行這些計算,並在IAP viewcontroller中使用它。

希望這能解決您的問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM