发布后访问实例变量

时间:2015-03-12 12:17:22

标签: ios objective-c memory-management

这是一个基本的内存管理代码。我正在处理一个没有实施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;

3 个答案:

答案 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消息,以便在其所有者的生命周期结束时清除它。