0

J'ai une méthode qui retourne une Card* NSObject (pour être clair, ce un objet de mon invention, que je correctement et définir avec succès dans mon Card.h et Card.m):Pourquoi NSObject renvoie-t-il int, erreur de distribution implicite? Un problème de pointeur w/ARC?

-(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]; 
} 

Il semble clair pour moi que cela devrait retourner un Card*, et pourtant, quand je l'appelle d'une autre méthode, comme ceci:

Card* selectedCard = readCardFromArrayWithCustomObjFromUserDefaults(indexPath); 

Je reçois l'avertissement:

conversion implicite de « int » à « carte * » est pas autorisée avec Arc

Je pensais que la question était que je ne jetterai pas vraiment à un Card* avant de revenir, mais si je change ma méthode readCardFromArrayWithCustomObjFromUserDefaults à explicitement jeté en tant que telle, je reçois toujours le même avertissement:

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

Pour être clair, je sais que cela ne retourne un Card*, parce que quand je mets ce même code dans la fonction appelant (au lieu de le séparer en sa propre méthode readCardFromArrayWithCustomObjFromUserDefaults) J'obtiens le Card*. J'essaie d'amincir mon code en mettant cette partie de code souvent utilisée dans sa propre méthode et je suis déconcerté de savoir pourquoi cela ne fonctionne pas.

J'ai essayé de renvoyer l'ensemble de mes NSArray* cartes à la place, mais cela provoque le même avertissement (conversion implicite juste à NSArray* au lieu de 'Card *'). Les réponses existantes à cet avertissement, telles que this et this ne semblent pas liées à ma situation (à moins que je ne manque vraiment quelque chose).

J'ai 2 idées sur ce qui pourrait se produire:

  1. Peut-être le fait que ces données sont en cours d'accès ailleurs pour alimenter un UITableView est Messing en quelque sorte le pointeur ou quelque chose. Peut-être que ARC est en train de nixer ma carte avant de pouvoir l'utiliser pour une raison déroutante (cela semble probable parce que le fait que le compilateur semble penser que ma méthode de retour retourne un int me fait penser que je reçois un pointeur et mon code pour une raison quelconque ne comprend pas que le pointeur pointe à un Card*).

Qu'est-ce que je fais mal?

Répondre

1

Je me sens extrêmement fou. Ensuite, Stack Overflow est un endroit qui vous rend heureux de vous sentir idiot. Le problème était juste que j'ai codé en c et C# trop longtemps, donc j'ai appelé la méthode incorrectement. Je l'ai écrit:

Card* thisCard = [self readCardFromArrayWithCustomObjFromUserDefaults:indexPath]; 

Au lieu de:

Card* selectedCard = readCardFromArrayWithCustomObjFromUserDefaults(indexPath); 
+1

Il devrait également y avoir une mise en garde au sujet d'une déclaration implicite ** ** de 'readCardFromArrayWithCustomObjFromUserDefaults', ce qui est un peu plus utile dans ce cas. –

+0

Vous avez raison.J'ai stupidement ignoré cela, pensant que je devais juste construire-> nettoyer car j'avais juste ajouté l'en-tête à mon .h. –