【问题标题】:Getting EXC_BAD_ACCESS when loading view (MBProgressHUD+ASIHTTPRequest)加载视图时获取 EXC_BAD_ACCESS (MBProgressHUD+ASIHTTPRequest)
【发布时间】:2011-02-11 14:07:49
【问题描述】:

问候,

我目前在我的 mainViewController 上管理“加载”屏幕时遇到问题(用户访问的第一个视图。)所以基本上第一个视图会下载图像并将其放在 UIImageView 上。发生这种情况时,MBProgressHUD 会显示。现在,用户使用自己的控制器进入 secondView。用户上传图像并返回。当用户返回主视图时,主视图会重新加载,因此不会显示与以前相同的图像。所以从逻辑上讲,“正在加载”MBProgressHUD 也应该显示。尽管如此,它甚至在它显示之前就崩溃了,它在进行转换时崩溃了。

问题是错误 exc_bad_access 只有在我实现了 MBProgressHUD 时才会出现(肯定是内存管理有问题,但我似乎不明白......)这些是有问题的代码段:

mainViewController.m

- (void)viewDidLoad {   
   HUD = [[MBProgressHUD alloc] initWithView:self.view];
   [self.view addSubview:HUD];
   HUD.delegate = self;
   HUD.labelText = @"Please Wait";
   [HUD showWhileExecuting:@selector(loadingOfImageAndInformation) onTarget:self        withObject:nil animated:YES];
   [super viewDidLoad];
}

- (void) loadingOfImageAndInformation {
    // [...] get URL and blabla.
    ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:imageURL];
    [request setDelegate:self];
    [request setDidFinishSelector:@selector(requestLoadDone:)];
    [request setDidFailSelector:@selector(requestLoadWentWrong:)];
    [request setDownloadProgressDelegate:HUD];
    [request startAsynchronous];
}

- (void)hudWasHidden {
   // Remove HUD from screen when the HUD was hidded
   [HUD removeFromSuperview];
   [HUD release];
   // HUD = nil; I tried this because I found it on another 
   // answer in S.O. but it didn't quite work. 
   // I don't think it is the same case.
   // I also tried putting this on the dealloc method and 
   // the didReceiveMemoryWarning to no avail... 
}

这是另一个question,它处理了类似的问题,但并没有真正解决我的问题。

非常感谢您以后的帮助!!

【问题讨论】:

  • 如果您需要构建堆栈,请告诉我。

标签: iphone objective-c asihttprequest


【解决方案1】:

很抱歉,我还没有阅读完整的问题。通常当你得到 EXC_BAD_ACCESS 时,很容易判断你是否启用了 NSZombie。如果它没有帮助删除评论,我会看看我是否可以改进我的答案。

要激活 NSZombie,请执行以下操作:

  1. 获取可执行文件的信息。
  2. 转到参数选项卡。
  3. 在“要在环境中设置的变量:”部分添加:

名称:NSZombieEnabled 值:是

然后像往常一样运行你的应用程序,当它崩溃时它应该告诉你哪个释放的对象收到了释放消息。

【讨论】:

    【解决方案2】:

    您将HUD 设置为request 的downloadProgressDelegate。也许request 在您释放HUD 后会尝试向它发送消息。如果您在调试器中运行代码,您在崩溃时获得的堆栈跟踪应该会告诉您是否是这种情况。

    【讨论】:

    • 我在 hudWasHidden 方法中释放了 HUD。只是为了代码清洁应该是正确的。然而,我考虑了你所说的,只是评论了 HUD 的发布。现在它可以工作了,但它不应该!我不明白。如果视图被重新加载,它不应该在加载视图时创建一个新的HUD吗?而不是尝试使用它的第一个实例?如果您能解释一下,我将不胜感激...
    • @Joze:在发布 HUD 之前,您是否尝试将 downloadProgressDelegate 设置为 nil?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多