2010-10-26 81 views
1

我有以下輔助對象:我是否正確釋放內存?

LikeHelper* likeHelper = [[LikeHelper alloc]init]; 
likeHelper.delegate = self; 
[likeHelper performLike:self.messageID]; 
[likeHelper release];likeHelper=nil; 

performLike會做一些NSURLConnection的東西,然後告訴委託它是否成功。

#pragma mark LikeHelperDelegate Methods 
-(void)performLikeFinished:(BOOL)isSuccessful{ 
    if (isSuccessful) { 
     UIAlertView *alertView; 
     alertView = [[UIAlertView alloc] initWithTitle:@"Success!" message:@"The message has been liked" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil]; 
     [alertView show]; 
     [alertView release]; 
    } 
    else { 
     UIAlertView *alertView; 
     alertView = [[UIAlertView alloc] initWithTitle:@"Error!" message:@"There was a problem liking your message" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil]; 
     [alertView show]; 
     [alertView release]; 
    } 

} 

我在正確的位置釋放likeHelper嗎?

回答

1

如果performLike:方法是異步的,likeHelper將在performLikeFinished方法被調用之前被釋放。您應該在owner對象的dealloc:方法或LikeHelperDelegate中的performLikeFinished:實現中釋放likeHelper,以防止過早釋放它,但如果您這樣做,請注意下面的JeremyPs註釋!

如果performLike:方法是同步的,你做的是正確的事,但你不需要委託來收集結果。

+0

它是異步的。這是否意味着我應該將LikeHelper聲明爲一個成員變量,以便我可以從LikeHelperDelegate訪問它? – 2010-10-26 09:28:15

+0

如果我在我的委託方法中釋放它,我不需要在dealloc()中正確釋放它? – 2010-10-26 09:30:39

+1

@Sheehan Alam:正確但要小心,如果您在委託方法中釋放對象,則在委託方法返回時,它將放入可能已被釋放的對象的上下文中。 – JeremyP 2010-10-26 10:43:56

0

是的,你的代碼是根據指導方針。

如果您的代碼不起作用,那麼問題可能是LikeHelper需要從-[LikeHelper performLike:]中保留self

您也不應該保留LikeHelperDelegate,這可能是導致混淆或錯誤的另一個原因。