为什么 NSObject 返回 int,隐式转换错误? ARC 的一些指针问题?
Why NSObject returning int, implicit cast error? Some pointer issue w/ ARC?
我有一个方法 return 是一个 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];
}
我似乎很清楚这应该 return 一个 Card*
,然而,当我从另一个方法调用它时,像这样:
Card* selectedCard = readCardFromArrayWithCustomObjFromUserDefaults(indexPath);
我收到警告:
Implicit conversion of 'int' to 'Card*' is disallowed with Arc
我认为问题可能在于我在 returning 之前并没有真正将其转换为 Card*
,但是如果我将 readCardFromArrayWithCustomObjFromUserDefaults
方法更改为显式转换为这样,我仍然收到相同的警告:
Card* thisCard = [existingDeck objectAtIndex:indexPath.row];
return thisCard;
明确地说,我知道这确实 return 一个 Card*
,因为当我将相同的代码放在调用它的函数中时(而不是将它分成它自己的 readCardFromArrayWithCustomObjFromUserDefaults
方法)我得到 Card*
。我试图通过将这个经常使用的代码部分放在它自己的方法中来精简我的代码,但我很困惑为什么它不起作用。
我已经尝试 return 我的整个 NSArray*
卡片,但这会导致相同的警告(只是隐式转换为 NSArray*
而不是 'Card*') .此警告的现有答案,例如 this and this 似乎与我的情况无关(除非我真的遗漏了什么)。
关于可能发生的事情,我有 2 个想法:
也许在其他地方访问此数据以填充 UITableView 的事实不知何故弄乱了指针或其他东西。
也许 ARC 出于某种莫名其妙的原因甚至在我使用它之前就将其禁用了(这听起来很可能是因为编译器似乎认为我显然 Card*
returning 方法 returns 一个 int 让我觉得我得到了一个指针,而我的代码出于某种原因不理解指针指向 Card*
).
我做错了什么?
我觉得非常愚蠢。话又说回来,Stack Overflow 是一个让你觉得自己很傻也很开心的地方。问题只是我用 C 和 C# 编写代码的时间太长了,所以我错误地调用了该方法。我应该写:
Card* thisCard = [self readCardFromArrayWithCustomObjFromUserDefaults:indexPath];
而不是:
Card* selectedCard = readCardFromArrayWithCustomObjFromUserDefaults(indexPath);
我有一个方法 return 是一个 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];
}
我似乎很清楚这应该 return 一个 Card*
,然而,当我从另一个方法调用它时,像这样:
Card* selectedCard = readCardFromArrayWithCustomObjFromUserDefaults(indexPath);
我收到警告:
Implicit conversion of 'int' to 'Card*' is disallowed with Arc
我认为问题可能在于我在 returning 之前并没有真正将其转换为 Card*
,但是如果我将 readCardFromArrayWithCustomObjFromUserDefaults
方法更改为显式转换为这样,我仍然收到相同的警告:
Card* thisCard = [existingDeck objectAtIndex:indexPath.row];
return thisCard;
明确地说,我知道这确实 return 一个 Card*
,因为当我将相同的代码放在调用它的函数中时(而不是将它分成它自己的 readCardFromArrayWithCustomObjFromUserDefaults
方法)我得到 Card*
。我试图通过将这个经常使用的代码部分放在它自己的方法中来精简我的代码,但我很困惑为什么它不起作用。
我已经尝试 return 我的整个 NSArray*
卡片,但这会导致相同的警告(只是隐式转换为 NSArray*
而不是 'Card*') .此警告的现有答案,例如 this and this 似乎与我的情况无关(除非我真的遗漏了什么)。
关于可能发生的事情,我有 2 个想法:
也许在其他地方访问此数据以填充 UITableView 的事实不知何故弄乱了指针或其他东西。
也许 ARC 出于某种莫名其妙的原因甚至在我使用它之前就将其禁用了(这听起来很可能是因为编译器似乎认为我显然
Card*
returning 方法 returns 一个 int 让我觉得我得到了一个指针,而我的代码出于某种原因不理解指针指向Card*
).
我做错了什么?
我觉得非常愚蠢。话又说回来,Stack Overflow 是一个让你觉得自己很傻也很开心的地方。问题只是我用 C 和 C# 编写代码的时间太长了,所以我错误地调用了该方法。我应该写:
Card* thisCard = [self readCardFromArrayWithCustomObjFromUserDefaults:indexPath];
而不是:
Card* selectedCard = readCardFromArrayWithCustomObjFromUserDefaults(indexPath);