仍对目标C中的内存管理感到好奇

时间:2011-03-19 09:17:00

标签: iphone objective-c ios memory-management

在从UIViewController派生的类中,有一个消息实现正在访问派生属性view,如下所示:

- (void) doSomethingOnView
{
  MyView *v = (MyView *) [self view];
  [v doOnView:YES];
  [v release];
}

根据UIView属性视图的快速文档,它是保留模式下的非原子读写属性。我在这里的书(例如Mark,Nutting,LaMarche的“Beginning iPhone 4 Development”)正在阅读有关在保留模式下阅读属性时需要获得的参考文献。

但我的分析器抱怨[v release]“调用者此时不拥有的对象的引用计数的减少不正确”。我的错在哪里?

4 个答案:

答案 0 :(得分:2)

在第一行中,MyView *v只是一个指针,指向您UIViewControllwer已拥有的属性。你UIViewController通过继承来获得它。它在别处声明,而不是由你声明,因此它不是alloc

当您将指针设置为指向您从未明确alloc编辑或retain编辑的对象时,您不需要release它,因为您从未增加其参考计数。 Read more here如果你很好奇。

重点是,不要拨打[v release];

答案 1 :(得分:1)

请考虑以下代码:

self.view = anotherView;

如果view是声明为retain的属性,则会隐式保留anotherView

当您指定变量时,这是有效的。

在您的代码中:

  1. 您没有使用属性(即点符号)
  2. 您没有分配任何变量
  3. 你尝试发布一些你没有自己用alloc分配的东西

如果不清楚,请再次阅读Apple的Objective-C文档的Declared PropertiesMemory management guide部分。

答案 2 :(得分:0)

您没有alloc视图,因此您无需发布它。

在本书的哪一部分,您在阅读本案需要发布?

答案 3 :(得分:0)

我认为你错误地解释了这本书的内容。如果您提供报价,我们可以进一步向您解释。

在这种情况下,您无需发布原因,因为没有allocretain发送到v。