0

loadView我创建 20 UIButtons 期间,我想根据 a 的状态更改标题文本UIPageControl

我有一个预保存 plist,它在当前页面更改的事件中加载到NSArray调用arrChars中,我将按钮标题设置为数组中的相关文本标题。执行此操作的代码是:

for (int i = 1; i < (ButtonsPerPage + 1); i++) {

    UIButton *uButton = (UIButton *)[self.view viewWithTag:i];

    if(iPage == 1) {
        iArrPos = (i - 1);
    } else {
        iArrPos = (iPage * ButtonsPerPage) + (i - 1);
    }

    [uButton setAlpha:0];

    NSLog(@"Trying: %d of %d", iArrPos, [self.arrChars count]);
    if (iArrPos >= [self.arrChars count]) {                    
        [uButton setTitle: @"" forState: UIControlStateNormal];
    } else {

        NSString *value = [[NSString alloc] initWithFormat:@"%@", [self.arrChars objectAtIndex:iArrPos]];
        NSLog(@"%@", value);

        [uButton setTitle: [[NSString stringWithFormat:@"%@", value]    forState: UIControlStateNormal];

        [value release];

        //////Have tried:
        //////[uButton setTitle: value forState: UIControlStateNormal];

        //////Have also tried:
        //////[uButton setTitle: [self.arrChars objectAtIndex:iArrPos] forState: UIControlStateNormal];

        //////Have also also tried:
        //////[uButton setTitle: [[self.arrChars objectAtIndex:iArrPos] autorelease] forState: UIControlStateNormal];
    }

    [uButton setAlpha:1];
}

设置按钮的标题时,它似乎不会自动释放上一个标题,并且分配会不断增加。我究竟做错了什么?

之前有人告诉我,通过分配跟踪事物是追踪泄漏的不好方法,因为据我所知,该对象没有在 Instruments 中泄漏,但我的总生存分配继续攀升,直到我收到内存警告。如果有更好的方法来跟踪那里,我很想知道。

更新

忘了提一下,我没有使用从数组中检索到的值,而是将标题设置为 @"Test" - 这很好,每次更改页面时都不会无休止地增加。

4

2 回答 2

0

您正在做很多不必要的字符串创建和格式化。您可以替换这些行:

NSString *value = [[NSString alloc] initWithFormat:@"%@", [self.arrChars objectAtIndex:iArrPos]];
NSLog(@"%@", value);

[uButton setTitle: [[NSString stringWithFormat:@"%@", value] forState: UIControlStateNormal];

用这些:

NSString *title = [self.arrChars objectAtIndex:iArrPos];

[uButton setTitle:title forState:UIControlStateNormal];
[title release];

使用setTitle:ontitle会增加保留计数 - 请务必在release之后使用。

于 2012-06-24T09:12:54.677 回答
0

经过许多漫长的夜晚,我决定硬着头皮把这个发送到苹果的 DTS 中。

虽然回复很有用,但不是我所希望的。在 arrChar 中偶尔会有字形,当加载时我被告知不要被卸载。完整解释:

据我所知,iOS 在将字形加载到内存后不会卸载它们。这就是为什么您在 Instrument.app 中看到内存分配在加载新字符时会增加,而在您稍后来回时保持不变。iOS 的设计行为几乎是我们无法改变的。如果你真的想控制内存使用,你可以交替将字符制作成图像,并使用 UIImage (imageWithContentsOfFile:) 来加载和释放。

希望这可以帮助那里的人。

于 2012-09-16T12:11:51.857 回答