推入iOS后发布

时间:2012-09-03 16:28:13

标签: iphone objective-c ios memory-management memory-leaks

所以我有以下代码,我将对象推送到另一个视图后释放它。当我分析它时,我得到错误 - 调用者此时不拥有的对象的引用计数的不正确的减少。有谁知道如何解决这个问题?每次遇到不同的内存泄漏时我都尝试了很多选项

- (void)showCurrentArticle:(id)sender {
    if(animating) 
        return; //it is already there
    animating = YES;
    JsonViewController *newsController = [(JsonViewController *)[self.newsNavController.viewControllers objectAtIndex:0]retain];
    newsNavController.title = @"Parliament";
    Item *currentItem = (Item *)[self.fetchedObjectsArray objectAtIndex:currentItemIndex];
    NSString * urlString = [CONST_FEED_DISCRIPTION_URL stringByAppendingString:currentItem.guid];
    [newsController initWithURLString:urlString date:currentItem.date];
    [self.navigationController pushViewController:newsController animated:YES];
    [newsController release];
}

4 个答案:

答案 0 :(得分:3)

此代码采用已存在于导航堆栈中的视图控制器,重新初始化它,然后再次将其推入堆栈。这似乎不对。您可能应该创建一个新的视图控制器。背景是什么?你想要实现什么目标?

答案 1 :(得分:1)

您正在弹出,更改标题,而不是进行初始化...

决定是否要对JsonViewController进行深度克隆(alloc,init,copy field values)或仅引用copy(retain)。如果你试图混合,它会很混乱。

答案 2 :(得分:1)

您不必保留和释放newsController对象。这就是你收到警告的原因。看起来newsController归newsNavController对象所有,它将保留它。您需要在此代码中保留newsController的唯一原因是您需要在此方法范围之外使用它。由于您不需要保留它,因此您无需释放它,因此会出现错误。您可能假设-initWithURLString:date:方法正在增加保留计数,但它只是new,alloc和retain来执行此操作。您可能应该重命名该方法以不使用术语init来避免混淆。

答案 3 :(得分:1)

你在做什么-initWithURLString:date: ???你刚刚添加网址吗?然后你应该调用它addURL... ...如果你真的再次初始化它,你可以将newsController变量的指针设置为一个新对象。它指向的第一个对象丢失了 - >泄漏。

我假设您将init方法命名为错误,只需将一个url添加到控制器中,该控制器已经存在于堆栈中并再次使用更高的保留计数添加它,但仍然是完全相同的对象。

不要这样做。复制对象或更好 - 创建viewController的新实例!!!