Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: Max von HippelОтветов: 1

У меня есть метод, который возвращает 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*).

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

objective-cnsobjectautomatic-ref-countingpointersimplicit-conversion

Ответы

Ответ 1 · рейтинг 1 · Max von Hippel

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

Card* thisCard = [self readCardFromArrayWithCustomObjFromUserDefaults:indexPath];

Вместо:

Card* selectedCard = readCardFromArrayWithCustomObjFromUserDefaults(indexPath);

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы