Que signifie id <…> dans Objective-C?

J'essaie d'utiliser Google Analytics dans une application iOS, et j'ai vu cette partie du code:

id<GAITracker> tracker = [[GAI sharedInstance] defaultTracker]; 

En tant que débutant dans le développement iOS, je ne sais pas quelle est la différence entre le id<GAITracker> tracker et le id<GAITracker> tracker GAITracker *tracker . Je l'ai cherché dans Google mais je n'ai pas trouvé l'explication. Quelqu'un peut-il me l'expliquer?

Merci.

Le <> signifie que l'object est conforme au protocole (protocoles pr) à l'intérieur des crochets.

Dans votre exemple, l'object tracker peut être n'importe quel type d'object mais il est conforme au protocole GAITracker .

Par conséquent, bien qu'il ne possède pas de class spécifique, vous pouvez toujours appeler des methods et des propriétés qui sont déclarées par ce protocole.

identifiant

id peut contenir n'importe quel type d'object.

id<GAITracker> tracker

Cela signifie que le tracker est un object de type id, qui peut contenir des objects confirmés par le protocole GAITracker

Quand vous utilisez "id" c'est comme void *, vous savez que c'est un pointeur mais vous ne connaissez pas le type. Lorsque vous utilisez, vous voulez dire que l'object met en œuvre MyProtocol. Vous ne connaissez pas le type de l'object, il peut NSObject, UIViewController, vous ne vous souciez pas. Vous voulez simplement que l'object implémente un set de protocoles. Enfin, GAITracker signifie que le type de l'object est GAITracker.

Ici, id est un pointeur qui contient un object.

et tracker est une instance conforme au protocole GAITracker .

Protocols make it possible for two classs distantly related by inheritance to communicate with each other to accomplish a certain goal. They thus offer an alternative to subclassing.

1.Le type d'id est conçu pour être un type générique pouvant contenir n'importe quel type d'object (en d'autres termes, id ne fonctionne pas avec les types primitifs, tels que ints et BOOL).

2.Imaginez que vous aviez une class qui traitait certaines données externes. Vous ne savez pas ou ne vous souciez pas de l'origine des données, mais vous devriez être prêt à gérer plusieurs types différents. Vos données peuvent provenir d'un file text, où le contenu peut être lu et transmis dans votre méthode en tant que NSSsortingng. Vous devrez peut-être traiter datatables dans votre propre programme ailleurs, et datatables seraient alors comme un NSArray ou NSSet. Alternativement, datatables pourraient provenir de l'Internet comme une réponse JSON, qui doit être analysée dans un NSDictionary (ne vous inquiétez pas si vous ne savez pas ce que JSON est … il y aura quelque chose à ce sujet plus tard).

 - (void)processData:(id)someData { if ([someData isKindOfClass:[NSSsortingng class]]) NSLog(@"input data is %@", someData); else if ([someData isKindOfClass:[NSArray class]]) { // Cast someData into an NSArray NSArray *dataArray = (NSArray *)someData; NSLog(@"First object in dataArray is %@", [dataArray objectAtIndex:0]); } else if ([someData isKindOfClass:[NSDictionary class]]) { // Cast someData into an NSDictionary NSDictionary *dataDict = (NSDictionary *)someData; NSLog(@"Keys in dataDict are %@", [dataDict allKeys]); } else if ([someData isKindOfClass:[NSData class]]) NSLog(@"someData is a bag of bits."); else NSLog(@"someData is an unsupported type:\n%@", someData); } 

Vous pouvez get plus de détails sur ce lien http://www.binpress.com/tutorial/learn-objectivec-objects-part-8-dynamic-typing/68