我正在为iOS开发一个游戏,游戏在一些游戏屏幕后被终止。我在Xcode中启动了instrument,我意识到我的屏幕之间的内存在不断增长。ARC已启用。
我使用标记生成功能来尝试跟踪前两个屏幕之间的废弃内存,如下图所示。
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发布于 2014-01-14 03:44:33
如果你担心内存没有被释放,我认为如果你专注于返回TitleScreen后的几代人,那么分析将会简化。当你在ChoosePlayer的时候,看看几代人可能只会让情况变得混乱。
因此,启动应用程序并获得初始标题屏幕,执行第A代。转到ChoosePlayer (不执行第1代),然后再次返回TitleScreen (等一下),然后执行第B代。对第C代和第D代重复此过程。
做完这些之后,把你的注意力集中在C代和D代上。不要担心A代(它在启动期间消耗了所有的东西),甚至B代(它可能包括可能被缓存的东西)。你真的想把注意力集中在返回第二次、第三次和后续时间之后的几代人身上。
https://stackoverflow.com/questions/21099200
复制相似问题