这是一个基本的内存管理代码。我正在处理一个没有实施ARC的旧应用程序。
我的问题:在将实例变量添加到视图后,可以访问它吗?释放它。
在我看来,在调用release之后访问一个实例变量可能是不对的,但是有人可以建议吗?
demoView = [[DemoView alloc] initWithFrame:[self demoRect:newType]];
[self addSubview:demoView]
[demoView release];
稍后在代码中访问它:
[demoView setBackgroundColor:[UIColor whiteColor]];
demoView.title = @"something";
对象稍后发布如下:
[demoView removeFromSuperview];
demoView = nil;
答案 0 :(得分:1)
调用此行时,demoView的retainCount为1.
demoView = [[DemoView alloc] initWithFrame:[self demoRect:newType]];
这一行之后
[self addSubview:demoView]
retainCount增加到2.
如果没有其他操作,但demoView稍后在dealloc中发布,或者刚刚删除,它仍然会有一个retainCount为1。 这就是开发人员调用
的原因[demoView release];
将retainCount保持为1.
P.S。
在较旧的保留/释放范例中,您必须维护retainCount并将其保持在检查状态。 retainC在增加到UIView/NSArray/NSDictionary
和调用retain
时会增加
当您调用release时,retainCount会减少,从UIView/NSArray/NSDictionary
中删除。
答案 1 :(得分:0)
将子视图添加到视图时,视图会保留子视图。 因此,如果您在发布子视图后使用子视图,它将起作用。但是使用你已经发布的一些对象是一种非常糟糕的做法。
答案 2 :(得分:0)
通常最好使用访问器方法,而不是直接在手动引用计数代码中操作ivars。考虑按以下方式重写实现:
self.demoView = [[[DemoView alloc] initWithFrame:[self demoRect:newType]]
autorelease]];
[self addSubview:demoView];
这样,如果从超级视图中删除演示视图,如果您希望稍后将其添加回视图层次结构,或者将其移动到其他超级视图,则可以安全地将其保留在内存中。在任何情况下,演示视图都应在release
中收到dealloc
消息,以便在其所有者的生命周期结束时清除它。