【问题标题】:Am I releasing memory correctly?我是否正确释放内存?
【发布时间】:2011-04-30 15:20:32
【问题描述】:

我有以下辅助对象:

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?

【问题讨论】:

    标签: iphone objective-c cocoa-touch memory nsurlconnection


    【解决方案1】:

    是的,您的代码符合指南。

    如果您的代码不起作用,那么问题可能是LikeHelper 需要在-[LikeHelper performLike:] 中保留self。

    您也不应该保留LikeHelperDelegate,这可能是另一个造成混淆或错误的原因。

    【讨论】:

      【解决方案2】:

      如果 performLike: 方法是异步的,likeHelper 可能会在 performLikeFinished: 方法被调用之前被释放。您应该在所有者对象的 dealloc: 方法中或在 LikeHelperDelegate 中的 performLikeFinished: 实现中释放 likeHelper,以防止过早释放它,但如果您这样做,请注意下面的 JeremyPs 评论!。

      如果 performLike: 方法是同步的,那么您正在做正确的事情,但您不需要委托来收集结果。

      【讨论】:

      • 它是异步的。这是否意味着我应该将 LikeHelper 声明为成员变量,以便我可以从 LikeHelperDelegate 访问它?
      • 如果我在委托方法中释放它,我不需要在 dealloc() 中释放它对吗?
      • @Sheehan Alam:正确但要小心,如果您在委托方法中释放对象,当委托方法返回时,它将进入可能已被释放的对象的上下文中。
      • 正确 JeremyP,在 dealloc: 中释放它比在委托方法中释放它更好。
      • @Gerco 我猜我会有很多likeHelper实例,直到调用dealloc。这很糟糕吗?
      猜你喜欢
      • 1970-01-01
      • 2015-06-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-23
      • 2023-03-11
      • 2020-11-28
      • 1970-01-01
      相关资源
      最近更新 更多