2010-12-20 45 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