Почему NSObject возвращает int, неявную ошибку приведения? Какая-то проблема с указателем с ARC?

У меня есть метод, который возвращает 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 идеи относительно того, что может произойти:

  1. Возможно, тот факт, что к этим данным обращаются в другом месте для заполнения UITableView, каким-то образом искажает указатель или что-то в этом роде.

  2. Может быть, ARC блокирует мою карту еще до того, как я смогу ее использовать по какой-то непонятной причине (это кажется вероятным, потому что тот факт, что компилятор, кажется, думает, что мой метод, очевидно возвращающий Card*, возвращает int, заставляет меня думать, что я получаю указатель и мой код для какая-то причина не понимает, что указатель указывает на Card*).

Что я делаю неправильно?


person Max von Hippel    schedule 21.07.2016    source источник


Ответы (1)


Я чувствую себя очень глупо. Опять же, Stack Overflow — это место, где вам приятно чувствовать себя глупо. Проблема была только в том, что я слишком долго программировал на c и C#, поэтому неправильно назвал метод. Я должен был написать:

Card* thisCard = [self readCardFromArrayWithCustomObjFromUserDefaults:indexPath];

Вместо:

Card* selectedCard = readCardFromArrayWithCustomObjFromUserDefaults(indexPath);
person Max von Hippel    schedule 21.07.2016
comment
Также должно быть предупреждение о неявном объявлении readCardFromArrayWithCustomObjFromUserDefaults, что немного полезнее в данном случае. - person jscs; 21.07.2016
comment
Вы правы. Я по глупости проигнорировал это, думая, что мне просто нужно собрать-›очистить, так как я только что добавил заголовок в свой .h. - person Max von Hippel; 21.07.2016