У меня есть метод, который возвращает Card* NSObject (чтобы было ясно, это объект моего собственного изобретения, который я правильно и успешно определяю в своих Card.h и Card.m):
-(Card*)readCardFromArrayWithCustomObjFromUserDefaults:(NSIndexPath *)indexPath;
{
NSData *existingData = [[NSUserDefaults standardUserDefaults] objectForKey:@"Deck"];
// if no such data exists, return nil
if (existingData == nil)
return nil;
NSArray *existingDeck = [NSKeyedUnarchiver unarchiveObjectWithData:existingData];
return [existingDeck objectAtIndex:indexPath.row];
}
Мне кажется очевидным, что это должно возвращать Card*, и тем не менее, когда я вызываю его из другого метода, вот так:
Card* selectedCard = readCardFromArrayWithCustomObjFromUserDefaults(indexPath);
Я получаю предупреждение:
Неявное преобразование «int» в «Card*» запрещено в Arc.
Я подумал, что, может быть, проблема в том, что я на самом деле не привел его к Card* перед возвратом, но если я изменю свой метод readCardFromArrayWithCustomObjFromUserDefaults на явное приведение как таковое, я все равно получу то же предупреждение:
Card* thisCard = [existingDeck objectAtIndex:indexPath.row];
return thisCard;
Чтобы было ясно, я знаю, что это возвращает Card*, потому что, когда я помещаю тот же самый код в вызывающую его функцию (вместо того, чтобы разделить его на собственный метод readCardFromArrayWithCustomObjFromUserDefaults), я получаю Card*. Я пытаюсь сократить свой код, поместив эту часто используемую часть кода в отдельный метод, и не понимаю, почему он не работает.
Вместо этого я попытался вернуть все свои NSArray* карт, но это вызывает то же предупреждение (просто неявное преобразование в NSArray* вместо «Карта*»). Существующие ответы на это предупреждение, такие как это и это не похоже на мою ситуацию (если только я действительно что-то не упустил).
У меня есть 2 идеи относительно того, что может произойти:
Возможно, тот факт, что к этим данным обращаются в другом месте для заполнения UITableView, каким-то образом искажает указатель или что-то в этом роде.
Может быть, ARC блокирует мою карту еще до того, как я смогу ее использовать по какой-то непонятной причине (это кажется вероятным, потому что тот факт, что компилятор, кажется, думает, что мой метод, очевидно возвращающий
Card*, возвращает int, заставляет меня думать, что я получаю указатель и мой код для какая-то причина не понимает, что указатель указывает наCard*).
Что я делаю неправильно?