我正在使用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在0x0000000c0 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!
感谢,如果有人能指出我在这里更好的方向..
我相当肯定我不这样做,因为你建议,因为只有调用setSearchingMode:NO是当a)如果我没有得到与NSURLConnection的连接,b)来自locationManager的didFailWithError,c)didFailWithError来自NSURLConnection,和d)connectionDidFinishLoading。不过,如果我以某种方式呢?将添加HUD =零;阻止它被过度释放?我不释放它dealloc,因为我释放它在我的函数setSearchingMode:NO – coco 2010-12-20 21:59:09
释放它后将变量设置为'nil'将阻止释放'消息发送到垃圾内存(从而导致'exc_bad_access'崩溃)。发送给nil的消息不做任何事情,消息被有效地丢弃,但是发送给解除分配的对象(由用于指向有效对象的变量指向的内存)的消息将导致崩溃,因为内存正在指出不再有效。我希望这是有道理的。 – Jasarien 2010-12-20 23:39:02
嘿,这对我来说是新的!如果我为一个对象分配内存,然后释放它,然后再释放它,我将遇到内存管理问题。但是如果我为一个对象分配内存,释放它,然后将其设置为零,那么我可以再次释放它,而不存在内存管理问题? – coco 2010-12-21 16:56:38