2010-10-04 1 views
7

У меня есть следующий код, который вызывает эту ошибку. Я не понимаю, почему сообщение subarrayWithRange отправляется в строку? Когда это явно массив?Непризнанный селектор, отправленный в экземпляр [NCRFString subarrayWithRange:]

static const int kItemsPerView = 20; 
NSRange rangeForView = NSMakeRange(page * kItemsPerView, kItemsPerView); 

NSMutableArray *temp = [[APP_DELEGATE keysArray] mutableCopyWithZone:NULL]; 
NSArray *itemsForView = [temp subarrayWithRange:rangeForView]; 

for (int loopCounter = 0;loopCounter < r*c;loopCounter++){ 
    NSLog(@"%i: %@ ", loopCounter, [itemsForView objectAtIndex:loopCounter]); 
} 

Ошибка:

-[NSCFString subarrayWithRange:]: unrecognized selector sent to instance 0x6b071a0 
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: [NSCFString subarrayWithRange:]: 

Благодаря

ответ

29

Такие ошибки, как правило, памяти, связанные с управлением. По сути, вы отправляете сообщение на адрес, который теперь занят каким-то другим объектом, потому что предыдущий пассажир неожиданно исчез. Поскольку это адресное пространство может быть занято чем угодно, вы просто попросите NSCFString что-то, на что он не отвечает.

Если вы приостановили отладчик сразу после создания массива temp, то, что вы видите назначенным temp? Я предполагаю, что что-то не совсем правильно с любым возвратом -keysArray. Возможно, вы захотите дважды проверить, как обрабатывается память во всем, что должно было возвращаться. По имени, я полагаю, у вашего делегата приложения есть массив с именем «keysArray» в качестве переменной экземпляра. Возможно, это не сохраняется должным образом, когда оно создано или назначено?

+0

После создания 'temp' представляет собой массив из 80 строк, отлаживать подсказка показывает только 10 элементов, хотя не уверен, что это просто Xcode или нет? Вы правы keysArray - это переменная экземпляра в моем делете делегата, свойство, определенное как (неатомное, сохраняемое), а затем синтезированное и назначенное с использованием метода удобства 'arrayWithContentsOfFile'. Мне не нужно сохранять его вручную? – joec

+0

Да. Вы не создали его, метод удобства сделал. Поэтому, если вы хотите, чтобы он придерживался после его создания, вам нужно подать заявку, сохранив (или создав собственную копию). Еще раз взгляните на правила управления памятью. –

+0

Если вы используете свойство accessor вместо назначения, вам не понадобится сохранение; или вы можете вместо этого вызывать '[[NSArray alloc] initWithContentsOfFile: @" somepath "]'. – jlehr

4

У меня был этот. Я сделал что-то глупое. Я присвоил UITextView строке вместо ее текстового свойства. то есть:

myObj.txtbxThing = [NSString stringWithFormat:@"%@", stuffString]; 

вместо:

myObj.txtbxThing.text = [NSString stringWithFormat:@"%@", stuffString]; 
+0

Я сделал что-то подобное глупо. Я назначил NSString для NSURL * и * как-то пропустил предупреждение компилятора об этом. –