使用[类保留]崩溃iOS应用程序:发送到已解除分配的实例

时间:2015-04-29 08:34:19

标签: ios objective-c iphone memory-management

我正在构建我的应用程序而且我是一个非常的菜鸟,所以请原谅我缺乏信息!

我能够在某些步骤中使我的应用程序崩溃才能重现,但有时只能。当它崩溃时,它会在main.m文件中执行:

enter image description here

我用" Throw"设置了一个异常断点。并分别与" Catch"并且它实际上并没有发现崩溃发生的任何特定代码行。

我如何找出导致此问题的原因或代码行?

enter image description here

我在iPhone 5s和6 Plus上进行测试,两者都崩溃了。

更新

我刚刚对此进行了一些测试,这是该应用的工作流程。

我有UITableViewController(称为更多标签)。我点击UIViewController(称为主题),然后在那里有一个按钮。我点击该按钮,它会调用UIAlertView。我点击非取消按钮,它会调出另一个UIViewController(称为IAP)。有UIButton的价格和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

viewDidLoad的{​​{1}}中,我有:

IAPViewController

我创建了一个属性:[self.unlimitedEntriesPurchase validateProductIdentifiers]; 并且我认为这是问题所在。

我希望这是有道理的,有助于确定问题所在。

@property (nonatomic, strong) UnliimitedEntriesPurchase *unlimitedEntriesPurchase;价格加载之前,用户将进入IAP并单击取消按钮(以解除IAPViewController)的罕见情况。但是,这是我想解决的问题,而不是发布这个明显的问题。

更新2

在我的IAPViewController中,我有一个自定义setter:

UIButton

通过在AppDelegate中设置alloc和init,if语句在此处不会生效,因此自定义委托永远不会被设置。

2 个答案:

答案 0 :(得分:2)

最可能的原因是你正在向一个解除分配的对象发起一个动作,你必须这样做:

产品--->简介--->僵尸(在乐器中)

然后检查仪器工具崩溃的对象是什么。

您可以在其他地方重新分配对象,作为示例我将向您展示如何在AppDelegate中重新分配它,首先您必须在AppDelegate.h中添加它

System.Web.Services.Protocols.SoapException: Server was unable to process request. ---> System.Data.SqlClient.SqlException: Invalid @eligible_ind value
   at Tessitura.WebAPI.Tessitura.UpdateGiftAidDeclaration(String sSessionKey, String sNotes, Int32 iGiftaidType, Int32 iN1N2Ind, Int32 iContactMethod, Int32 iIneligibleReason, Int32 iDocumentStatus, DateTime dStartDate, DateTime dEndDate, Char cEligibleInd, Char cCreateNew)
   --- End of inner exception stack trace ---

那是你的AppDelegate.m

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

在视图控制器中,您必须导入AppDelegate.h并像这样分配您的对象

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

之后你可以触发所有的unlimitedEntriesPurchase方法因为它永远不会被释放,如果你有什么问题可以解雇[AppDelegate sharedDelegate] .unlimitedEntriesPurchase

答案 1 :(得分:-3)

解决方案非常简单,但您能否先回答以下两个问题 -

  1. 你为什么不使用ARC?如果您使用ARC而不是手动保留/释放,则不会遇到此问题。

  2. 为什么要触发另一个viewcontroller(UnlimitedPriceEntries)来计算价格。 ViewControllers不应该用于业务逻辑。相反,你应该编写另一个NSObject类来进行这些计算,并在IAP viewcontroller中使用它。

  3. 我希望这可以解决你的问题。