我正在使用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