0

So I have the following code where I am releasing an object after pushing it to another view. When I analyse it I get the error - Incorrect decrement of the reference count of an object that is not owned at this point by the caller. Would anyone know how to fix this? I've tried so many options each time getting a different memory leak

- (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

4 回答 4

3

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

于 2012-09-03T16:34:27.470 回答
1

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

于 2012-09-03T17:51:16.807 回答
1

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

决定您是对JsonViewController(alloc、init、复制字段值)进行深度克隆还是仅引用副本(保留)。如果您尝试混合,以后会很混乱。

于 2012-09-03T16:41:33.073 回答
1

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

我假设您将 init 方法命名错误,只是将 url 添加到控制器中,该控制器已经在堆栈中,然后以更高的保留计数再次添加它,但仍然是相同的对象。

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

于 2012-09-03T18:35:47.090 回答