释放视图控制器是否会释放其所有属性?

时间:2012-03-15 02:55:36

标签: objective-c ios memory-management automatic-ref-counting

我有一个BaseViewController,它是UITabBarController的子类,并在这个视图控制器中设置我的视图。

-(void)setUpViews
{
FirstController *mainViewController = [[FirstController alloc] initAssignment:delegate.currentAssignment withMutableArray:myArray];
UINavigationController *firstNavController = [[UINavigationController alloc] initWithRootViewController:mainViewController];


SecondController *secondViewController = [[SecondController alloc] initWithNibName:@"SecondController" bundle:nil];
UINavigationController *secondNavController = [[UINavigationController alloc] initWithRootViewController:secondViewController];


self.viewControllers = [NSArray arrayWithObjects:firstNavController, secondNavController,nil];

firstNavController.tabBarItem.image = [UIImage imageNamed:@"blablabla.png"];
firstNavController.tabBarItem.title = @"Stream";


secondViewController.tabBarItem.image = [UIImage imageNamed:@"blabla.png"];
secondViewController.tabBarItem.title = @"Favourite";
}

现在我有另一个视图控制器,我称之为ViewHandlerController,是BaseViewController的子类。在我viewDidLoad的{​​{1}}中,我调用viewHandler中声明的setUpViews。在我的应用程序的第一个屏幕中,当按下Login按钮时,我实例化我的BaseViewController,并使用导航控制器成功地显示我的tabcontroller。

ViewHandlerController

在我的应用内。有一个退出按钮。我正在使用[[[UIApplication sharedApplication].windows objectAtIndex:0] addSubview:viewControllerHandler.view]; 来调用我的第一个屏幕中声明的logoutMethod。我的问题是,在这个logoutMethod中,我如何释放以前分配的对象以避免内存压力,因为用户可以再次登录(logIn - logOut -logIn)?因为我正在使用ARC,所以将我的ViewController设置为NIL会做所有的清理工作吗?

编辑:从superview中删除我的ViewControllerHandler并将其设置为nil也有助于发布其子视图?

干杯

2 个答案:

答案 0 :(得分:2)

好吧,回答你的问题(不是ARC) - 不,基本视图控制器在发布时不释放他的属性。但是你应该在viewDidUnload和(或)dealloc方法中使你的属性无效。

如果您使用ARC,您应该注意到某些操作可以保留您的控制器,并且在某些情况下永远不会删除它。注意方法,它接受委托对象,他们可能不使用弱引用

答案 1 :(得分:1)

看一下这个Apple article about memory management

您可以在alloc方法中使用autorelease或在 dealloc 中使用for (UIView *view in [self.view subviews]) {view release};

enter image description here

事实上,释放是保留相反的操作。保留时,在分配的内存中增加1个对象实例计数。当你致电alloc, copy, new, mutableCopy时就会发生这种情况。如果您使用的是ARC,则无法释放对象,内存管理不是您的问题。