2012-05-30 235 views
2

我是iOS開發新手。我在運行後臺線程時遇到問題。在我的代碼中,resetUi正在主UI線程上運行,現在我開始後臺線程來獲取圖像數據並更新我的圖像。一切工作正常,但當調用執行SelectorInBackground時內存泄漏。使用performSelectorInBackground時發生內存泄漏

請讓我知道我做錯了。另外請建議如果在從URL(dataWithContentsOfURL)中獲取時更新我的​​圖像是否有更好的方法。

[更新]

儀器正在顯示2個獨立的泄漏一個在perfromSelectorInBackground和其他在UIImage的imageWithData。我想有些事情正在發生可怕的錯誤與imageUpdate的(imageWithData)

-(void)updateData{ 
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];  

    profileName.text = oAuthTwitter.screen_name; 

    if(profilePic.image == nil){ 
     NSString *urlString = @"https://api.twitter.com/1/users/profile_image/"; 
     urlString = [urlString stringByAppendingFormat:oAuthTwitter.screen_name]; 
     urlString = [urlString stringByAppendingFormat:@"?size=bigger"];    
     profilePic.image = [UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:urlString]]];   
     [activityIndicator stopAnimating]; 
     [activityIndicator release]; 
    } 
    [pool drain]; 

} 

- (void)resetUi{ 

    if (oAuthTwitter.oauth_token_authorized) { 
     profilePic.hidden = NO; 
     profileName.hidden = NO; 

     NSLog(@"Resetting to authorised state"); 
     [self performSelectorInBackground:@selector(updateData) withObject:nil]; 

    }else{ 

     NSLog(@"Resetting Twitter UI to non-authorized state."); 

    profilePic.hidden = YES; 
     profileName.hidden = YES;  

    } 

} 

回答

3

我認爲你應該使用

[pool release]; 

而不是

[pool drain]; 

這是遠遠更好的做法。

你也可以嘗試在主線程中釋放activityIndi​​cator嗎?

從你給的代碼我找不到任何其他原因泄漏..你有沒有嘗試過使用泄漏儀和靜態分析儀來運行你的代碼?

+0

我試着改變它,但沒有運氣。 – vijaykumarg

+0

是的,我正在使用泄漏儀器運行代碼。請澄清我是否有任何其他替代方法從URL中獲取圖像。我想這是造成所有的麻煩。 – vijaykumarg

+0

您是否更改了我在答案中提到的activityIndi​​cator?另外關於從URL獲取圖像,你的邏輯看起來不錯,我不認爲這是你的問題的原因 – Krishnabhadra

相關問題