【问题标题】:Can't locate abandoned memory in iOS App在 iOS 应用程序中找不到废弃的内存
【发布时间】:2014-02-01 15:58:48
【问题描述】:

我正在开发一款适用于 iOS 的游戏,但游戏在某些游戏画面后被终止。我在 Xcode 中启动了仪器,我意识到我的屏幕之间的内存一直在增长。 启用 ARC。

我使用标记生成功能来尝试跟踪前两个屏幕之间的废弃内存,如下图所示。

Generations A 在应用启动后立即进入 TitleScreen。 B、C 和 D 在从 ChoosePlayer 回来后立即出现在 TitleScreen。

这些屏幕有一些通过 InterfaceBuilder 创建的 UIImageViews 和 UIButtons 我删除了所有以编程方式创建的视图。如您所见,似乎有很多废弃的内存,但我不知道如何跟踪它们,因为堆栈来自实习生 API 调用。

我也没有引用任何其他视图控制器。 (没有强循环参考)。

以下是 TitleScreen 视图控制器的完整代码。

我确定这一定是一个愚蠢的错误,但我找不到它。有任何想法吗? 谢谢。

@interface SMTitleScreenViewController ()
@property (weak, nonatomic) IBOutlet UIButton *buttonPlay;
@property (weak, nonatomic) IBOutlet UIButton *buttonCamera;
@property (weak, nonatomic) IBOutlet UIImageView *titleBG1;
@property (weak, nonatomic) IBOutlet UIImageView *titleBG;

- (IBAction)onButtonPlay:(id)sender;
- (IBAction)onButtonCamera:(id)sender;
@end

@implementation SMTitleScreenViewController

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self)
    {

    }
    return self;
}

- (void)viewDidLoad
{
    [super viewDidLoad];

    UIColor* color = [UIColor colorWithRed:0.2509f green:0.1176f blue:0.0745f alpha:1.0f];
    UIFont* font = [UIFont fontWithName:@"Jungle Roar" size:BUTTON_FONT_SIZE];

    NSString* playString = NSLocalizedString(@"Play", @"");
    NSString* cameraString = NSLocalizedString(@"Camera", @"");

    [self.buttonPlay setTitle:playString forState:UIControlStateNormal];
    [self.buttonPlay setTitle:playString forState:UIControlStateHighlighted];
    [self.buttonPlay setTitleColor:color forState:UIControlStateNormal];
    [self.buttonPlay setTitleColor:color forState:UIControlStateHighlighted];
    self.buttonPlay.titleLabel.font = font;

    [self.buttonCamera setTitle:cameraString forState:UIControlStateNormal];
    [self.buttonCamera setTitle:cameraString forState:UIControlStateHighlighted];
    [self.buttonCamera setTitleColor:color forState:UIControlStateNormal];
    [self.buttonCamera setTitleColor:color forState:UIControlStateHighlighted];
    self.buttonCamera.titleLabel.font = font;

}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

- (IBAction)onButtonPlay:(id)sender
{
    [self performSegueWithIdentifier:@"titleToChooseAnt" sender:self];
}

- (IBAction)onButtonCamera:(id)sender
{

}
@end

【问题讨论】:

  • 如果你启用了 ARC,你为什么要使用 @autoreleasepool。你试过没有?
  • 其实,我添加它是作为一个绝望的措施。原代码没有。
  • 我会删除它并删除 viewDidDisappear 代码开始。什么叫废弃的记忆?
  • SMTitleScreenViewController 是否经常被实例化?直接还是通过子类?我遇到了类似的问题,不得不删除我的 IBOutlets 并替换为标签。原因是每个未归档的副本在使用带有 xib 的 iboutlets 时都必须创建自己的版本。我会尝试查看是否可以查找文档,但相信它在可可概念文档中。
  • 在没有自动释放池和 viewDidDisappear 的情况下仍然会发生。废弃的内存仍然在我的应用程序中徘徊,但我无法再访问它了。

标签: ios iphone objective-c xcode memory-management


【解决方案1】:

如果你担心内存没有被释放,我认为如果你专注于返回TitleScreen之后的世代,分析会被简化。看看你在ChoosePlayer 的几代人可能只会让情况变得混乱。

所以,启动应用程序并获得初始标题屏幕,执行 A 代。转到 ChoosePlayer(不要执行一代)然后再次返回 TitleScreen(等待一秒钟)并执行 B 代. 对 C 代和 D 代重复该过程。

完成之后,将注意力集中在 C 代和 D 代上。不要担心 A(它在启动期间消耗了所有东西),甚至 B(可能包括可能被缓存的东西)。您真的想在第二次、第三次和后续次返回后将注意力集中在几代人身上。

【讨论】:

  • 谢谢罗伯。我按照指示做了并创建了 A、B、C、D 代。我用图像更新了线程。结果是内存增长和项目似乎是我为每个屏幕捕获的 2 代的总和。我的应用程序的每个屏幕都在经历内存增长,我尝试分析标题并选择播放器,因为它们是更简单的播放器。我不知道发生了什么。
  • 我应该声明的一件重要的事情是,我正在模拟器上的发布版本下对此进行分析。 (当我尝试在设备上运行 Instruments 时,它会触发应用程序并在退出后立即退出,仍然不知道为什么)
  • @felipedrl 好的。谢谢。顺便说一句,您已经共享了您的 TitleScreen 控制器,但问题几乎肯定不会出现在那里,而是出现在您访问和返回的其他视图控制器的代码中。您可能应该迭代地注释掉越来越多的后续代码,并迭代地查看您是否可以确定导致这种情况的原因。但是我们很难根据迄今为止提供的内容来猜测(我同意 Instruments 的扩展细节并不是很有帮助)。
猜你喜欢
  • 2014-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-17
  • 1970-01-01
  • 2011-04-30
  • 1970-01-01
相关资源
最近更新 更多