代码之家  ›  专栏  ›  技术社区  ›  Max von Hippel MD. Sahib Bin Mahboob

为什么NSObject返回int,隐式转换错误?是否存在带ARC的指针问题?

  •  0
  • Max von Hippel MD. Sahib Bin Mahboob  · 技术社区  · 8 年前

    我有一个返回 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* selectedCard = readCardFromArrayWithCustomObjFromUserDefaults(indexPath);
    

    不允许使用Arc将“int”隐式转换为“Card*”

    我想问题可能是我没有真正把它变成 卡片* 在回来之前,但如果我改变我的 readCardFromArrayWithCustomObjFromUserDefaults 方法显式强制转换,我仍然收到相同的警告:

    Card* thisCard = [existingDeck objectAtIndex:indexPath.row];
    return thisCard;
    

    明确地说,我知道这确实返回了一个 卡片* ,因为当我将相同的代码放在调用它的函数中时(而不是将其分离成自己的代码 使用自定义对象从用户默认值从阵列读取卡片 方法)我得到 卡片* 。我正试图通过将这个经常使用的代码部分放在自己的方法中来精简我的代码,但我对它为什么不起作用感到困惑。

    我试着把我的全部 NSArray* 但这会导致相同的警告(只是隐式转换为 NSArray(国家存储阵列)* 而不是“卡*”)。此警告的现有答案,例如 this this 似乎与我的情况无关(除非我真的错过了什么)。

    关于可能发生的事情,我有两个想法:

    1. 也许,为了填充UITableView,其他地方正在访问这些数据,这是在某种程度上弄乱了指针或其他东西。

    2. 也许ARC在我还没来得及使用它之前就取消了我的卡(这听起来很可能是因为编译器似乎认为我的 卡片* returning方法返回一个int值,这让我觉得我得到的是一个指针,而我的代码由于某种原因无法理解指针指向 卡片* ).

    我做错了什么?

    1 回复  |  直到 7 年前
        1
  •  1
  •   Max von Hippel MD. Sahib Bin Mahboob    8 年前

    我觉得自己太傻了。再说一遍,堆栈溢出是一个让你感到愚蠢的地方。问题是我用c和c#编码的时间太长了,所以我错误地调用了该方法。我应该写:

    Card* thisCard = [self readCardFromArrayWithCustomObjFromUserDefaults:indexPath];
    

    而不是:

    Card* selectedCard = readCardFromArrayWithCustomObjFromUserDefaults(indexPath);