[__NSCFString superview]: нераспознанный селектор отправлен экземпляру

Я пытаюсь скопировать NSMutableArray* в NSArray*, но это не работает и генерирует ошибку [__NSCFString superview]: нераспознанный селектор отправлен в экземпляр. Вот код:

//where gc is a NSDictionary*, recentKey is a NSString*, and _objects is a NSArray*
//gc is an singleton is used to save chache data, with NSKeyedUnarchiver class
//_objects is used to reload the UITableView's data

NSArray *savedNews = [[NSArray alloc] initWithArray:[gc objectForKey:recentkey]];

//this not works...why??
_objects = [[NSArray alloc] initWithArray:savedNews];

Решение:

Да, как предполагает Герман, ошибка была внешней. В массиве saveNews использовался класс с NSEncoding с ошибкой:

- (void)encodeWithCoder:(NSCoder *)encoder {
//...where element was NSString* and not "UIImageView"
// element should be imgView
    if (imgView) [encoder encodeObject:element forKey:@"imgView"];
}

Спасибо за всех, ребята.


person fcortes    schedule 20.11.2012    source источник
comment
Какая именно строка не работает? Вы уверены, что разместили весь код в контексте?   -  person Vladimir    schedule 20.11.2012
comment
_objects — это NSArray*. Неудачная строка — это присвоение _objects.   -  person fcortes    schedule 20.11.2012


Ответы (2)


Где-то в вашем приложении находится супервизор извлеченного объекта NSString. Я предполагаю, что вы назначили объект NSString чему-то, где ожидается UIView. Может быть что-то вроде:

someButton.textLabel = someString; // wrong - but should generate a compiler warning

вместо

someButton.textLabel.text = someString; // correct

Это не имеет прямого отношения к вашей проблеме с массивом.

person Hermann Klecker    schedule 20.11.2012
comment
Как сказал Германн, ваша проблема не связана с предоставленным вами кодом. Вы должны дважды проверить код, связанный с пользовательским интерфейсом. - person Fahri Azimov; 20.11.2012
comment
Только это происходит, если _objects переназначается. Возможно ли, что факт изменения данных влияет на UITableView или некоторые представления? - person fcortes; 20.11.2012
comment
Для начала следует точно определить, в какой момент выполнения кода возникает проблема. Не ищите побочных эффектов, таких как Это происходит только тогда, когда .... Вы установили точку останова исключения? Если нет - сделайте это. Если вы не видите сообщения об ошибке в точке разрыва, нажмите кнопку «Продолжить» еще один или два раза, и вы приблизитесь к основной причине вашей проблемы. - person Hermann Klecker; 20.11.2012

Во-первых, проверьте, что объект в словаре для этого ключа.

NSLog(@"GC Object type for recentkey:%@", [[gc objectForKey:recentkey] class]);

Вы можете передать NSArray только в initWithArray: Итак, если этот объект еще не является NSArray, но вы хотите, чтобы этот объект находился в массиве. Сделай это..

id obj = [gc objectForKey:recentkey]; //Because I have no idea what this is
NSArray *savedNews = [NSArray arrayWithObject:obj];
person estobbart    schedule 20.11.2012