Нераспознанный селектор отправлен в экземпляр [NSCFString subarrayWithRange:]

У меня есть следующий код, который вызывает эту ошибку. Я не могу понять, почему сообщение 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:]:

Спасибо


person joec    schedule 04.10.2010    source источник


Ответы (2)


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

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

person Joshua Nozzi    schedule 04.10.2010
comment
После создания temp представляет собой массив из 80 строк, подсказка отладки показывает только 10 элементов, хотя не уверен, что это просто Xcode или нет? Вы правы keysArray — это переменная экземпляра в моем делегате приложения, свойство, определенное как (неатомарное, сохраняемое), а затем синтезированное и назначенное с использованием удобного метода arrayWithContentsOfFile. Мне не нужно сохранять его вручную, не так ли? - person joec; 05.10.2010
comment
да. Вы не создали его, это сделал удобный метод. Поэтому, если вы хотите, чтобы он оставался после создания, вам нужно заявить о себе, сохранив (или создав собственную копию). Взгляните еще раз на правила управления памятью. - person Joshua Nozzi; 05.10.2010
comment
Если вы используете метод доступа к свойству вместо назначения, то вам не понадобится сохранение; или вместо этого вы можете позвонить [[NSArray alloc] initWithContentsOfFile:@"somepath"]. - person jlehr; 05.10.2010
comment
Верно, но я думаю, что важно знать, что стоит за удобствами, которые дает Objective-C 2 (@property, @synthesize и т. д.). На самом деле, чтобы эффективно использовать объявления @property в среде без сборки мусора, вам нужно столько же знать об управлении памятью Cocoa. - person Joshua Nozzi; 05.10.2010
comment
исправлена ​​​​проблема путем изменения назначения на сильный - person Jerry; 24.07.2013

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

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

вместо:

myObj.txtbxThing.text = [NSString stringWithFormat:@"%@", stuffString];
person Jeff    schedule 02.04.2012
comment
Я сделал что-то подобное глупо. Я назначил NSString для NSURL и каким-то образом пропустил предупреждение компилятора об этом. - person Liron Yahdav; 31.01.2014