我正在为iOS开发一款游戏,游戏在一些游戏画面后终止。我在Xcode中启动了仪器,我意识到我的屏幕之间的内存不断增长。 ARC已启用。
我使用了标记生成功能来尝试跟踪前两个屏幕之间的废弃内存,如下图所示。
在触发应用程序后立即在TitleScreen中获取世代A. 从ChoosePlayer返回后,B,C和D立即来自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
答案 0 :(得分:0)
如果您担心记忆力不会被释放,我认为如果您在返回TitleScreen
后专注于几代人,分析将会简化。当你在ChoosePlayer
时看几代人可能只会让情况混乱。
因此,启动应用程序并获取初始标题屏幕,执行生成A.转到ChoosePlayer
(不要做一代)然后再次返回TitleScreen
(等待一秒钟)并进行生成B.对C代和D代重复该过程。
完成此操作后,请将注意力集中在C代和D代。不要担心A(启动期间消耗的所有内容),甚至B(可能包含可能缓存的内容)。在第二次,第三次以及随后的返回时,你真的想把注意力集中在几代人身上。