1

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

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

对于第 2 步,内存使用率不会降低。我希望在从屏幕上删除屏幕 B 时释放屏幕 B 消耗的内存......我应该怎么做才能确保这种释放发生?

从 A 到 B :

GameVC_iPad *game = [[GameVC_iPad alloc]initWithNibName:@"ClassicGameVC_iPad" bundle:nil]; [自我presentViewController:游戏动画:是完成:无];

使用以下代码从 B 回到 A:

HomeVC_iPad *home = [[HomeVC_iPad alloc]initWithNibName:@"HomeVC_iPad" bundle:nil]; home.modalTransitionStyle = UIModalTransitionStyleCrossDissolve; [self presentViewController:home 动画:YES 完成:nil];

有什么线索吗?

4

3 回答 3

2

当你回到A时,你应该做

[self dismissModalViewControllerAnimated:YES];

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

A 呈现 B,然后你呈现一个新的 A,然后呈现一个新的 B,依此类推......

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

于 2012-06-17T14:42:37.953 回答
0

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

于 2012-06-17T14:43:04.457 回答
0

如果您为 b 创建了一个委托类,例如您将其命名为 BDelegate 并使 A 的 ViewController 符合该协议,那么您可以轻松地将一条消息传回给 A,您希望删除 B。因此,例如,您可以创建:

代表:

@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 将为您关闭它:)

希望这可以帮助

于 2012-06-26T10:53:20.100 回答