在从UIViewController派生的类中,有一个消息实现正在访问派生属性view
,如下所示:
- (void) doSomethingOnView
{
MyView *v = (MyView *) [self view];
[v doOnView:YES];
[v release];
}
根据UIView属性视图的快速文档,它是保留模式下的非原子读写属性。我在这里的书(例如Mark,Nutting,LaMarche的“Beginning iPhone 4 Development”)正在阅读有关在保留模式下阅读属性时需要获得的参考文献。
但我的分析器抱怨[v release]
“调用者此时不拥有的对象的引用计数的减少不正确”。我的错在哪里?
答案 0 :(得分:2)
在第一行中,MyView *v
只是一个指针,指向您UIViewControllwer
已拥有的属性。你UIViewController
通过继承来获得它。它在别处声明,而不是由你声明,因此它不是alloc
。
当您将指针设置为指向您从未明确alloc
编辑或retain
编辑的对象时,您不需要release
它,因为您从未增加其参考计数。 Read more here如果你很好奇。
重点是,不要拨打[v release];
。
答案 1 :(得分:1)
请考虑以下代码:
self.view = anotherView;
如果view
是声明为retain
的属性,则会隐式保留anotherView
。
当您指定变量时,这是有效的。
在您的代码中:
如果不清楚,请再次阅读Apple的Objective-C文档的Declared Properties和Memory management guide部分。
答案 2 :(得分:0)
您没有alloc
视图,因此您无需发布它。
在本书的哪一部分,您在阅读本案需要发布?
答案 3 :(得分:0)
我认为你错误地解释了这本书的内容。如果您提供报价,我们可以进一步向您解释。
在这种情况下,您无需发布原因,因为没有alloc
或retain
发送到v。