【问题标题】:iOS app memory usage keeps going up in XcodeXcode 中的 iOS 应用程序内存使用率不断上升
【发布时间】:2014-04-12 23:25:42
【问题描述】:

我是 iOS 编程的新手,我刚刚构建了一个 iPhone 应用程序,它可以向用户提问并返回答案。构建环境为 OS X 10.9 和 Xcode 5.0.2。每次我启动 iPhone 模拟器时,Debug Navigator 都会显示内存使用量为 13.5mb,但即使在我返回主屏幕后它也会继续上升。一分钟后,内存使用量将稳定在 17.5mb 左右。这是正常行为还是我需要添加一些内存管理代码?

#import "QuizViewController.h"

@interface QuizViewController ()

@property (nonatomic) int currentQuestionIndex;
@property (nonatomic, copy) NSArray *questions;
@property (nonatomic, copy) NSArray *answers;

@property (nonatomic,weak) IBOutlet UILabel *questionLable;
@property (nonatomic,weak) IBOutlet UILabel *answerLable;

@end

@implementation QuizViewController

- (instancetype) initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if(self){
        self.questions = @[@"From what is cognac made?",
                           @"What is 8 + 8 ?",
                           @"What is the capital of Minnesota?"];
        self.answers = @[@"Grapes",
                         @"16",
                         @"St.Paul"];
    }

    return self;
}

- (IBAction)showQuestion:(id)sender
{
    self.currentQuestionIndex++;
    if (self.currentQuestionIndex == [self.questions count]){
        self.currentQuestionIndex = 0;
    }
    NSString *question = self.questions[self.currentQuestionIndex];
    self.questionLable.text = question;
    self.answerLable.text = @"???";
}
- (IBAction)showAnswer:(id)sender
{
    NSString *answer = self.answers[self.currentQuestionIndex];
    self.answerLable.text = answer;
}

@end

【问题讨论】:

  • 为什么你的 UIViewController 初始化方法使用“- (instancetype) ”而不是“- (id)”?
  • 如果内存使用稳定,那么你可能没问题。如果在您在控制器之间来回切换时它一直在上升,那么您做错了。
  • Michael,这个链接说使用 instancetype 比使用 id 更好。 stackoverflow.com/questions/8972221/…

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


【解决方案1】:

使用 ARC 可以自动进行内存管理。您是否在输出中收到内存警告日志?如果没有,那么你很好。除此之外,我认为这是正常的。

【讨论】:

  • +1 提到 ARC,你秒杀我。
  • 我没有收到任何警告日志。剂量 ARC 就像 Java 中的垃圾收集器一样工作?有没有我必须自己释放()内存的情况?谢谢!
  • 我对 java 了解不多,所以我不能确切地说,但是 ARC(自动引用计数)可以做到这一点,这样您就不必在创建对象后释放或释放对象。这是它所做的简短版本。 en.wikipedia.org/wiki/Automatic_Reference_Counting 这将为您提供更多信息。主要是只要您没有收到“收到内存警告”。登录然后你就不用担心了
  • 是的,它就像垃圾收集器,如果您没有收到内存警告,我不同意您不应该担心。通常内存泄漏不足以在短时间内收到内存警告。有一些 iOS 对象不是由 ARC 管理的,所以即使它们被解除,如果没有显式释放它们的内存也会保留,例如核心图形对象。反正作者说记忆是长大后稳定下来的——这很正常,很好!
  • iOS 模拟器不会发出内存警告。并且内存警告不是验证内存使用是否正常的好方法。发送警告之后的已用内存量因设备而异。应用程序可能根本无法在内存较低的设备(iPhone 4 (512 MB RAM),甚至 3GS (256 MB RAM))上运行,但它不会在 iPhone 5(1 GB RAM)等设备上触发内存警告)。
猜你喜欢
  • 1970-01-01
  • 2019-10-08
  • 2016-06-02
  • 1970-01-01
  • 2012-11-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-11
  • 2023-03-19
相关资源
最近更新 更多