Обнаружена утечка в методе делегата UITextView. Смущен решением - PullRequest
0 голосов
/ 03 августа 2011

У меня проблема с UITextView и одним из его методов делегатов в моем приложении на основе навигации:

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

Мне удалось ограничить максимальную длину текста, который пользователь может вводить с помощью вышеуказанного метода,Но я думаю, что я использую массив с утечками.

Проблема в том, что я хочу сохранить количество напечатанных символов в тот самый момент, когда пользователь вводит последнюю строку моего текстового представления.Затем я использую это значение для вычисления длины строки, которую я сравниваю с размером содержимого 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];
    }
    */
}

Я попробовал вышеприведенное утверждение, но это дает мне сбой приложения, когда я покидаю последнюю строку текстового представления.И как вы можете видеть в комментариях к коду - без освобождения массива я получаю утечку.

Так как и где мне правильно освободить этот массив - чтобы он был безопасным, пока пользователь находится на последней строке?

1 Ответ

1 голос
/ 03 августа 2011

Просто замените на

первый

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];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...