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