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