characterAtIndex, возвращающий неверные значения - PullRequest
0 голосов
/ 04 октября 2009

Я получаю некоторые странные числа, возвращенные из метода characterAtIndex для Object-C в iPhone SDK. Фрагмент кода выглядит следующим образом:

 NSString *new_text;
 new_text = [new_text stringByAppendingFormat:@"%@",UITextView_1.text];//=a,b,...f

 for(int i = 0; i <= 6; i++)
 {
   char_num   = [new_text characterAtIndex:i];   
 } 

Я пытаюсь получить десятичное число для отдельного символа. Я либо получаю неправильное значение каждый раз. Иногда значение больше 8000! Я должен вернуть номер 65 через 71.

Ответы [ 2 ]

1 голос
/ 04 октября 2009

new_text - это локальная переменная, она не инициализируется, и вы отправляете ей сообщение перед присвоением ему значения. В отличие от вновь выделенных объектов Objective-C, значения локальных переменных не обнуляются автоматически, поэтому значение указателя new_text является тем, что произошло в этой ячейке памяти до выполнения метода. Другими словами, ваш указатель new_text указывает на недетерминированную область памяти, поэтому поведение здесь не определено и непредсказуемо. Обычно это приводит к сбою, но по чистой случайности вы указываете на что-то похожее на строку, но содержимое этой строки также недетерминировано. Отсюда и странные значения символов.

n.b. Это отличный пример того, почему рекомендуется всегда инициализировать локальные переменные, когда они объявлены.

1 голос
/ 04 октября 2009

new_text равно нулю, когда вы отправляете stringByAppendingFormat на него. Законно отправлять сообщение нулевому объекту - он просто ничего не делает. Таким образом, new_text никогда не инициализируется, отсюда и странные значения.

если бы new_text был инициализированной NSMutableString, ваш код был бы в порядке:

// stringByAppendingFormat is an instance method and must be called on a non-nil instance
NSMutableString* text = [NSMutableString string];
text = [text stringByAppendingFormat:@"%@",UITextView_1.text];

// stringWithFormat is a class method and can be used to initialize an instance
NSString* text = [NSString stringWithFormat:@"%@",UITextView_1.text];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...