2010-12-20 40 views
2

我正在使用MBProgressHUB,其代码中的变体here使用MBProgressHUD的内存泄漏

我的代码有些事情:

  • 的代码是在我的应用程序委托
  • 一些其他类的称之为
  • 我使用它与异步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在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页头] initWithWindow“ - 我不想继续分配一个ivar!

感谢,如果有人能指出我在这里更好的方向..

回答

1

如果你碰巧使用的序列结束:

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

的,因为悬挂的描述代码会崩溃参考HUD。当你做[HUD release];时,在该行后添加HUD = nil;

这不是内存泄漏;它是一个过度释放。或者,更可能的是,一个悬而未决的参考。

(当然我不 我的dealloc释放)

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

+0

我相当肯定我不这样做,因为你建议,因为只有调用setSearchingMode:NO是当a)如果我没有得到与NSURLConnection的连接,b)来自locationManager的didFailWithError,c)didFailWithError来自NSURLConnection,和d)connectionDidFinishLoading。不过,如果我以某种方式呢?将添加HUD =零;阻止它被过度释放?我不释放它dealloc,因为我释放它在我的函数setSearchingMode:NO – coco 2010-12-20 21:59:09

+0

释放它后将变量设置为'nil'将阻止释放'消息发送到垃圾内存(从而导致'exc_bad_access'崩溃)。发送给nil的消息不做任何事情,消息被有效地丢弃,但是发送给解除分配的对象(由用于指向有效对象的变量指向的内存)的消息将导致崩溃,因为内存正在指出不再有效。我希望这是有道理的。 – Jasarien 2010-12-20 23:39:02

+0

嘿,这对我来说是新的!如果我为一个对象分配内存,然后释放它,然后再释放它,我将遇到内存管理问题。但是如果我为一个对象分配内存,释放它,然后将其设置为零,那么我可以再次释放它,而不存在内存管理问题? – coco 2010-12-21 16:56:38