[英]Get [Not a type retain] and [Not a type class] message sent to deallocated instance
[英]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
在IAPViewController
的viewDidLoad
中,我具有:
[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
解決方案非常簡單,但是您可以先回答以下兩個問題嗎?
為什么不使用ARC? 如果使用ARC而不是手動保留/釋放,則不會遇到此問題。
為什么要觸發另一個視圖控制器(UnlimitedPriceEntries)來計算價格。 ViewControllers不應用於業務邏輯。 相反,您應該編寫另一個NSObject類來進行這些計算,並在IAP viewcontroller中使用它。
希望這能解決您的問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.