【问题标题】:memory leak using MBProgressHUD使用 MBProgressHUD 的内存泄漏
【发布时间】:2010-12-20 21:44:43
【问题描述】:

我正在使用 MBProgressHUB,发现代码的变体 here

关于我的代码的一些事情:

  • 代码在我的 App Delegate 中
  • 许多其他类都调用它
  • 我将它与异步 NSURLConnection 一起使用
  • 我确实声明它:@property (nonatomic, retain) MBProgressHUD *HUD;
  • :@synthesize HUD;
  • (当然我不会在我的 dealloc 中释放它)

我是这样使用的:

- (void)setSearchingMode:(BOOL)isSearching {
    // when network action, toggle network indicator and activity indicator
    if (isSearching) {
        [UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
        
        UIWindow *theWindow = [UIApplication sharedApplication].keyWindow;
        HUD = [[MBProgressHUD alloc] initWithWindow:theWindow];
        [theWindow addSubview:HUD];
        
        //HUD.labelText = @"Connecting";
        [HUD show:YES];
    } else {
        [UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
        
        [HUD hide:YES];
        [HUD removeFromSuperview];
        [HUD release];
    }
}

- (void)setSearchingText:(NSString *)whatToSay {
    HUD.labelText = whatToSay;
}

我相当确定代码在某处引起了内存管理问题。在我的崩溃日志中,我得到:

异常类型:EXC_BAD_ACCESS (SIGBUS)
异常代码:KERN_PROTECTION_FAILURE at 0x0000000c

0 libobjc.A.dylib 0x000027d8 objc_msgSend + 16
1 我的 0x00003120 -[MyAppDelegate setSearchingMode:] (MyAppDelegate.m:363)
2 我的 0x00003458 -[MyAppDelegate connectionDidFinishLoading:] (MyAppDelegate.m:341)
3 基础 0x00032896 -[NSURLConnection(NSURLConnectionReallyInternal) sendDidFinishLoading] + 62
4 基础 0x00032818 _NSURLConnectionDidFinishLoading + 72

在 connectionDidFinishLoading 我调用:

[self setSearchingMode:NO];

我尝试通过为 HUD 制作属性访问器来做到这一点,但无法绕过“[MBProgressHUD alloc] initWithWindow”这一行 - 我不想继续分配 ivar!

谢谢,如果有人可以在这里为我指明更好的方向..

【问题讨论】:

    标签: iphone objective-c memory-management


    【解决方案1】:

    如果你碰巧得到以下序列:

    [self setSearchingMode:YES];
    [self setSearchingMode:NO];
    [self setSearchingMode:NO];
    

    由于对HUD 的悬空引用,该代码将如所述那样崩溃。当您执行[HUD release]; 时,在该行之后添加HUD = nil;

    这不是内存泄漏;这是一个过度释放。或者,更有可能是一个悬空引用。

    (当然我不会在 我的dealloc)

    为什么不呢?如果你保留它,你最好释放它!

    【讨论】:

    • 我很确定我没有按照你的建议做,因为对 setSearchingMode:NO 的唯一调用是 a) 如果我没有与 NSURLConnection 建立连接,b) didFailWithError 来自locationManager,c) 来自 NSURLConnection 的 didFailWithError,以及 d) connectionDidFinishLoading。不过,如果我不知何故呢?将添加 HUD = nil;阻止它被过度释放?而且我没有在 dealloc 中释放它,因为我在我的函数 setSearchingMode:NO 中释放了它
    • 在释放变量后将其设置为nil 将阻止release 消息被发送到垃圾内存(从而导致exc_bad_access 崩溃)。发送给 nil 的消息不做任何事情,消息被有效地丢弃,但是发送给一个已释放对象(由一个变量指向的内存,该变量曾经指向一个有效对象)的消息将导致崩溃,因为内存现在正在指向不再有效。我希望这是有道理的。
    • 嘿,这对我来说是新的!如果我为一个对象分配内存,然后释放它,然后再释放它,我就会遇到内存管理问题。但是如果我为一个对象分配内存,释放它,然后将它设置为 nil,那么我可以再次释放它而不会出现内存管理问题?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-19
    • 2012-05-05
    • 1970-01-01
    • 2012-03-24
    • 2019-09-14
    • 2011-06-11
    • 2011-07-27
    相关资源
    最近更新 更多