@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?
5 Réponses :
Supprimer l'ID * et remplacer par ID. ID est déjà un pointeur. P>
ok .. Réponse est "ID" au lieu de "ID *". P>
Pourquoi Downvote? Il a posté ceci comme le premier parce qu'il s'est présenté le problème lui-même.
Vous êtes légèrement éteint dans votre utilisation - c'est: (car vous retournez ID, pas un pointeur sur un objet). P> P>
Quelle est la différence entre un pointeur à un objet b> et id b>?
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 * ... ...
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
C'est un astérisque, pas un astérisque: en.wikipedia.org/wiki/asterix ;) ( m'a pris trois fois pour obtenir ce commentaire!)
parce que id code> est essentiellement
nsObject * code> (bien qu'il existe des différences mineures). Ainsi, lorsque vous retournerez
auto code>, vous retournez
- (nsobject *) code>. Ce que vous avez, c'est
id * code> qui est comme
nsObject ** code>. P>
ID CODE> est un typlef pour
struct objc_object * code>, pas
nsobject * code>. La différence est significative.
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.