2016-08-08 7 views
1

Я разрабатываю настройку для iOS, используя Logos/Theos.Переменная освобождается между вызовами

Мне нужно сохранить последние два символа, которые пользователь набрал во все времена.

Мой код для этого:

static NSString *lastTwoChars = [[NSString alloc] init]; 
... 
if (lastTwoChars.length < 2) { 
    lastTwoChars = [lastTwoChars stringByAppendingString:text]; 
} else { 
    lastTwoChars = [lastTwoChars stringByAppendingString:text]; 
    lastTwoChars = [lastTwoChars substringFromIndex:1]; 
} 
... 

(В этой области, text является последним символом они вошли в клавиатуре)

Этот код работает отлично, пока я не нажимать на третий символ. После очень долгого испытания и ошибок я обнаружил, что это происходит потому, что переменная lastTwoChars освобождается и становится другим объектом.

Я не могу понять, как сохранить объект от освобождения и перейти на другой объект. Я пробовал переменную retain, но либо я делаю это неправильно, либо это не сработает.

Любая помощь была бы принята с благодарностью.

+0

методы вы используете сделать, действительно, возвращает новый объект 'NSString'. Вы используете ARC или MRC? – Droppy

+0

@ Droppy Независимо от значения по умолчанию. Я никогда не настраивал его на разные. –

ответ

-1

Хорошо. Я наконец-то понял. Спасибо Droppy за намек на проблему.

Я установил его, сохраняя при этом новые строки:

if (lastTwoChars.length < 2) { 
    lastTwoChars = [[lastTwoChars stringByAppendingString:text] retain]; 
} else { 
    lastTwoChars = [[lastTwoChars stringByAppendingString:text] retain]; 
    lastTwoChars = [[lastTwoChars substringFromIndex:1] retain]; 
} 

Я не знал, что stringByAppendingString и substringFromIndex создавали новые NSString объекты, так что спасибо еще раз Droppy.

EDIT: Я думал, что это может быть утечка памяти, но Droppy подтвердила это.

Это мой новый код:

if (lastTwoChars.length < 2) 
{ 
    lastTwoChars[lastTwoChars.length] = (unichar) text; 
} 
else 
{ 
    lastTwoChars[0] = lastTwoChars[1]; 
    lastTwoChars[1] = (unichar) text; 
} 
+0

Итак, теперь у вас есть утечка памяти ... Если вам всегда нужны последние 2 символа, почему бы не использовать 'static unichar lastTwoChars [2];'? – Droppy

+0

@ Droppy Я не думал об этом, спасибо. Я отредактировал ответ. Это верно? –

+0

Нет, совсем нет. Вам нужно '[text characterAtIndex: index]', где вам нужно вычислить 'index'. – Droppy