ios arc migrated project presentViewController之后的内存清理

时间:2012-06-17 14:39:12

标签: ios memory-management automatic-ref-counting presentmodalviewcontroller

我迁移到ARC后使用Instrument我意识到从屏幕转换不会清理内存。 步骤示例:

1)主屏幕A - >游戏画面B =内存使用量的上升 2)游戏结束,我从屏幕B回到主屏幕A

对于第2步,内存使用量不会降低。当屏幕B从屏幕上移除时,我想释放屏幕B消耗的内存......我应该怎样做才能确保这种释放发生?

从A到B:

  

GameVC_iPad * game = [[GameVC_iPad alloc] initWithNibName:@“ClassicGameVC_iPad”bundle:nil];           [self presentViewController:游戏动画:YES完成:nil];

使用此代码完成从B回到A:

  

HomeVC_iPad * home = [[HomeVC_iPad alloc] initWithNibName:@“HomeVC_iPad”bundle:nil];       home.modalTransitionStyle = UIModalTransitionStyleCrossDissolve;       [self presentViewController:home animated:YES completion:nil];

有任何线索吗?

3 个答案:

答案 0 :(得分:2)

当你回到A时,你应该做

[self dismissModalViewControllerAnimated:YES];

你目前正在做的是创建一个错误的新视图控制器并再次导航到它,所以这就是正在发生的事情

A礼物B然后你呈现一个新的A,然后呈现一个新的B ans等等......

另请注意,当您导航到新的viewController iOS缓存一些视图数据时,您将无法在返回之前和之后实现完美的内存使用,

答案 1 :(得分:0)

不要创建家庭控制器的新副本。使用dismissViewControllerAnimated:completion:返回现有帐户。

答案 2 :(得分:0)

如果你为b创建一个委托类,那么就举个例子你称它为BDelegate并使A的ViewController符合该协议,那么你就可以轻松地将一条消息传回给你想要删除B的A。例如,您可以创建:

BDelegate:

@protocol BDelegate <NSObject>

- (void)dismissViewB;

@end

然后将A(头文件)的视图控制器更改为:

@interface AViewController : UIViewController <BDelegate>

显然在那里使用视图控制器的实际名称。 在视图控制器A的主体中,添加以下方法

- (void)dismissViewB {
    [self dismissViewControllerAnimated:YES completion:NULL];
}

几乎就在那里!现在在B视图控制器中,无论您想要实际删除视图,我都会假设您当前拥有

HomeVC_iPad *home = [[HomeVC_iPad alloc]initWithNibName:@"HomeVC_iPad" bundle:nil];
home.modalTransitionStyle = UIModalTransitionStyleCrossDissolve; 
[self presentViewController:home animated:YES completion:nil];

将其替换为

[delegate dismissViewB];

现在你需要在视图控制器B内部的所有内容都是指向A的委托并指定它的实例变量。所以在控制器B的标题中添加类似

的内容
NSObject<BDelegate> *delegate;

为它添加适当的@property,并在体内添加@synthesise。然后,当您在第一篇文章中创建视图控制器B时,只需添加

即可
game.delegate = self

然后,如果一切顺利,当你点击按钮或做你需要做的任何事情来移除视图时,视图控制器A会为你解雇它:)

希望这有帮助