iOS ARC不取消分配视图

时间:2013-06-25 06:11:51

标签: ios objective-c memory memory-management

我们正在创建一个带有主菜单的应用程序,您可以从中导航到带有后退按钮的第二个视图以及大约6个其他按钮,这些按钮将6个不同的子视图加载到内存(数组)中,具体取决于您选择的那个。

当用户选择“后退”按钮时,我想从使用6个按钮在屏幕中分配的内存中删除任何内容。

目前,应用程序只是建立了内存,似乎没有任何东西被释放。 请参阅以下网址中的屏幕截图:

http://oi41.tinypic.com/jfi8ma.jpg

 //Load all tab views into memory before loading them into an array
TimeViewController *timeView = [[TimeViewController alloc]init];
LocationViewController *locationView = [[LocationViewController alloc]init];
DropOffViewController *dropOffView = [[DropOffViewController alloc]init];
CompanyViewController *companyView = [[CompanyViewController alloc]init];
PaymentViewController *paymentView = [[PaymentViewController alloc]init];

//Set delegates of the tab views
timeView .delegate = self;
locationView.delegate = self;

//Load all tab views into array
[tabViews insertObject:timeView atIndex:0];
[tabViews insertObject:locationView atIndex:1];
[tabViews insertObject:dropOffView atIndex:2];
[tabViews insertObject:companyView atIndex:3];
[tabViews insertObject:paymentView atIndex:4];

for(int x = 0; x<5;x++)
{
    UIViewController *tempView = [[UIViewController alloc]init];
    tempView = [tabViews objectAtIndex:x];

    [self addChildViewController:tempView];
}

感谢您的帮助

2 个答案:

答案 0 :(得分:5)

您创建了一个保留周期。

您将代理人声明为强大的属性。这意味着当你做

timeView .delegate = self;

timeView保留self

timeView作为子视图控制器添加到self时,self会保留timeView

如果self拥有tabViews的强引用,那么它就是tabViews的所有者,它是添加到其中的对象的所有者,这会产生另一个保留周期:{{1}拥有拥有self的{​​{1}}的{​​{1}}。

如果您不想要保留周期,您的子对象绝不能强烈提及其父母或父母的父母。永远不要将代表声明为强大的财产。

至于您的“必须__weak”错误,请参阅this answer

答案 1 :(得分:0)

尝试使用此代码擦除后退按钮操作中的内存

for(UIView *view in self.view.subviews)
{
    [view removeFromSuperView];
    view=nil;
}