【发布时间】: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