Обнаружена утечка в методе делегата UITextView. Запутался в решении

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

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

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

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

Вот код:

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];
    }
    */
}

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

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


person Leakazoid    schedule 03.08.2011    source источник


Ответы (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];
person Praveen-K    schedule 03.08.2011
comment
Спасибо за помощь м8! Это может сработать. Глупая я, что не подумала об этом! НО на самом деле у меня появилась собственная идея, и я переписал весь метод. В конце концов я нашел способ, даже не используя массивы и прочее... ;) Если хотите, я опубликую его здесь. Но поскольку я новичок, мне не разрешено отвечать на свой вопрос в течение следующих 6 часов. Я сделаю это тогда, если вам интересно. Только скажи мне. И еще раз спасибо! :) - person Leakazoid; 03.08.2011
comment
вы всегда можете использовать pastebin(pastebin.com) и отправить нам ссылку в своем комментарии. - person Praveen-K; 03.08.2011
comment
Ой. Даже не знал о таком сервисе... ;) Вот ссылка: pastebin.com/BfJJnEbV - И еще раз спасибо. Может быть, мне стоит изменить строку lastLine на вашу версию! - person Leakazoid; 04.08.2011
comment
да, дайте мне знать, работает ли это с заменой строки lastLine на мою версию? В своем ответе я просто немного улучшил ваш код. :) - person Praveen-K; 04.08.2011