11
votes

Madness de Protocole d'Objective-C - Comment retourner un objet basé sur le protocole?

@protocol Eating
@end

@interface Eat : NSObject<Eating>
{
}
- (id<Eating> *)me;
@end

@implementation Eat
- (id<Eating> *)me { return self; }
@end
In the above piece of Objective-C code, why does "return self" result in a "Return from incompatible pointer type" warning? What's the incompatible pointer type and how to fix it?

1 commentaires

Utilisez @Protocol Manger - il vous permettra d'utiliser des méthodes NsObject sur ces objets, plutôt que des méthodes que vous avez besoin.


5 Réponses :


1
votes

Supprimer l'ID * et remplacer par ID. ID est déjà un pointeur.


0 commentaires

2
votes

ok .. Réponse est "ID" au lieu de "ID *".


1 commentaires

Pourquoi Downvote? Il a posté ceci comme le premier parce qu'il s'est présenté le problème lui-même.



0
votes

Vous êtes légèrement éteint dans votre utilisation - c'est: xxx

(car vous retournez ID, pas un pointeur sur un objet).


2 commentaires

Quelle est la différence entre un pointeur à un objet et id ?


En fait, il n'y en a pas - c'est pourquoi votre code n'a pas fonctionné. (NsObject *) et (ID) sont un peu déjà la même chose (pas vraiment assez proche de cette discussion) Alors, quand vous dites (id *) C'est comme dire (NsObject **). Oui, c'est un peu bizarre que l'identifiant et la classe sont les deux objets où vous n'utilisez pas le * ... ...



14
votes

parce que id code> est un pointeur lui-même, vous n'avez pas besoin de l'astérisque.

@interface Eat : NSObject<Eating> {
}
- (id<Eating>)me;
@end


1 commentaires

C'est un astérisque, pas un astérisque: en.wikipedia.org/wiki/asterix ;) ( m'a pris trois fois pour obtenir ce commentaire!)



1
votes

parce que id est essentiellement nsObject * (bien qu'il existe des différences mineures). Ainsi, lorsque vous retournerez auto , vous retournez - (nsobject *) . Ce que vous avez, c'est id * qui est comme nsObject ** .


1 commentaires

ID est un typlef pour struct objc_object * , pas nsobject * . La différence est significative.