2

我有一个不断更新的字符串(每秒约 33 次)。它被一遍又一遍地使用,并且在我要去的循环中无处不在。这是循环:

- (void)add{
    int r = (arc4random() % 30) + 51;
    long long debtInt = [debtString longLongValue];
    long long multiplier = r;
    long long debtAdj = multiplier + debtInt;
    debtString = [NSString stringWithFormat:@"%lli", debtAdj];
    [debtString retain];
    [self formating];
}

- (void)formating{
    NSNumberFormatter * f = [[NSNumberFormatter alloc] init];
    [f setNumberStyle:NSNumberFormatterDecimalStyle];
    NSNumber * myNumber = [f numberFromString:debtString];
    [f release];

    NSNumberFormatter *numberFormatter = [[NSNumberFormatter alloc] init];
    [numberFormatter setNumberStyle:NSNumberFormatterCurrencyStyle];
    [numberFormatter setMaximumFractionDigits:0];
    NSString *formattedNumberString = [numberFormatter stringFromNumber:myNumber];
    [numberFormatter release];

    UILabel *myLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 325, 100)];
    myLabel.font = [UIFont fontWithName:@"Verdana" size: 20.0];
    myLabel.text = formattedNumberString;
    myLabel.textAlignment = UITextAlignmentCenter;

    [self.view addSubview:myLabel];
    [myLabel release];
}

NSTimer 每 0.03 秒触发一次。我认为我可以在逻辑上释放它的一个地方debtString是在它被转换为一个 long long 整数之后。但是,这会使应用程序崩溃。如果我删除该[debtString retain]行,应用程序将崩溃。

内存建立起来很快,它是一个 14 字节的字符串。每秒创建另外 462 字节的错误分配内存,连同所有的调整,大约为 3696 字节/秒。这不是我可以忽略的泄漏。我只是不知道在哪里释放它循环!

4

4 回答 4

4

如果你致力于这样做,你应该debtString在循环的每次迭代中释放你的,就在你重新分配值之前:

[debtString release];    
debtString = [NSString stringWithFormat:@"%lli", debtAdj];
[debtString retain];

但是,您将在每个循环中创建一个新实例。使用单个NSMutableString(如@OscarMk 建议的)并每次更新它会更好。并且不要UILabel每次都创建一个新的。只需创建一个并每次通过循环更新内容。

于 2011-07-19T23:45:45.267 回答
2

如果 NSMutableString 经常更新,您应该特别使用它。

于 2011-07-19T23:39:07.173 回答
0

当你使用 stringWithNumber: 方法时,你会得到一个在自动释放池中的字符串。当您返回事件循环时,这些会被释放。

而是使用显式 alloc 和 init:

[debtString release];  // release previous (if any)
debtString = [[NSString alloc] initWithFormat:@"%lli", debtAdj];

如果 debtString 是一个保留的 @property,这就是 setter 将为您做的事情。

而且highlycaffeinated是对的,不要每次都新建UILabel,更新文本字段就好了。NSNumberFormatter 也一样,将其保存为实例变量,这样您就不必每次都创建它(然后您只需将它添加到子视图一次)。

于 2011-07-20T05:32:51.093 回答
0

The issue was I was declaring the variables each time, rather than synthesizing them in the header. Fixed it in ten minutes.

于 2011-07-21T19:09:11.313 回答