在UITextView委托方法中发现了泄漏。对解决方案感到困惑

时间:2011-08-03 16:19:38

标签: iphone objective-c ios xcode uitextview

我在基于导航的应用中遇到了UITextView及其委托方法之一的问题:

- (BOOL)textView:aView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text

我设法限制用户可以使用上述方法输入的文本的最大长度。但我认为我正在使用泄漏阵列。

问题是: 我希望在用户输入textview的最后一行时保存输入字符的数量。然后我使用该值来计算字符串长度 - 我将其与textview的内容大小进行比较以设置限制。代码工作正常 - 但由于它内部的方法是使用每个文本输入进行更新,因此我无法在适当的时刻发布数组。

以下是一些代码:

if (numLines == 9)
{
    if (!numCharsArray) 
    {
        numCharsArray = [[NSMutableArray alloc] initWithCapacity:1]; // Stack trace gives this line 3,3% of the leak.
    }

    numChars = tView.text.length;
    NSNumber *number = [[NSNumber alloc] initWithInteger:numChars]; // This line gets 77,3%.
    [numCharsArray addObject:number]; // This line gets the rest, 24,3%.
    [number release];

    startChars = [[numCharsArray objectAtIndex:0] integerValue];

    NSString *lastLine = [[NSString alloc]initWithString:[[tView text] substringFromIndex:startChars]];
    CGSize lineSize = [lastLine sizeWithFont:tView.font forWidth:tView.contentSize.width lineBreakMode:UILineBreakModeWordWrap];
    [lastLine release];

    if (range.length > text.length) 
    {
        return YES;
    }
    else if (numLines == 9 && lineSize.width >= tView.contentSize.width - 45)
    {
        return NO;
    }
}
else
{
    numCharsArray = nil;
    /* 
    if(numCharsArray)
    {
        [numCharsArray release];
    }
    */
}

我尝试了上面的评论声明,但是当我离开textview的最后一行时,这会让我崩溃。正如您在代码注释中看到的那样 - 在不释放数组的情况下,我得到了泄漏。

那么我如何以及在何处正确发布该数组 - 在用户位于最后一行时保持其安全?

1 个答案:

答案 0 :(得分:1)

只需替换为

第一个

numCharsArray = [NSMutableArray array]; // you do not need to release 
                                           //explicitly as its autorelease numberWithInt

第二个

NSNumber *number = [NSNumber numberWithInt:numChars]; //autorelease

NSString *lastLine = [[tView text] substringFromIndex:startChars];