为什么这段代码会导致内存泄漏?

5

Xcode中的泄漏工具向我展示了一个内存泄漏。我已经注释掉了泄漏工具报告的受影响行,但是我在我的内存管理中没有看到任何错误...

- (void)setupViewController {
    MyViewController *myVC = [[MyViewController alloc] init];

    UITabBarItem *tbi = [[UITabBarItem alloc] initWithTabBarSystemItem:UITabBarSystemItemDownloads tag:1];
    myVC.tabBarItem = tbi; // LEAK: 128 bytes

    self.myViewController = myVC;

    [myVC release];
    [tbi release];
}

我明白...tbi和myVC最终被释放,alloc也是平衡的。那么问题出在哪里呢?我不理解。
2个回答

3
如果MyVc.tabBarItem已经设置,无论它指向什么,可能不会正确地被释放,从而导致内存泄漏。

myVC 的 tabbar 属性应该定义为 retain 属性。这样做,分配给该属性的对象的保留将自动维护。 - TechZen
好的,但是tabBarItem是来自苹果,而不是我;-) 我没有为我的视图控制器创建任何tabBarItem属性。苹果公司创建了它。如果我手动释放myVC.tabBarItem,那么这将违反内存管理规则,因为苹果可能忘记这样做,不是吗? - dontWatchMyProfile
tabBarItem是一个具有retain语义的属性。很不可能在setter中出现泄漏。 - Nikolai Ruhe

2

这恰恰说明以下至少有一个陈述是正确的:

  1. 仪器不是完美的,有时会显示出不存在的漏洞(反之亦然)。
  2. Apple的代码并非没有错误。

事实上,两者都是正确的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接