我正在尝试在iOS应用中使用Google Analytics,我看到了以下代码:
id<GAITracker> tracker = [[GAI sharedInstance] defaultTracker];
作为iOS开发的初学者,我不知道id<GAITracker> tracker
和GAITracker *tracker
之间有什么区别。我在Google上搜索了但没有找到解释。能否有人为我澄清一下?
我正在尝试在iOS应用中使用Google Analytics,我看到了以下代码:
id<GAITracker> tracker = [[GAI sharedInstance] defaultTracker];
作为iOS开发的初学者,我不知道id<GAITracker> tracker
和GAITracker *tracker
之间有什么区别。我在Google上搜索了但没有找到解释。能否有人为我澄清一下?
<> 表示对象符合方括号内的协议(或多个协议)。
在您的例子中,对象 tracker
可以是任何类型的对象,但它符合 GAITracker
协议。
因此,即使它没有一个特定的类,您仍然可以调用由该协议声明的方法和属性。
这里的 id 是一个保持对象的指针。
tracker 是一个遵循 GAITracker
协议的实例。
协议使得两个通过继承远相关的类可以相互通信以完成某个目标,因此它们提供了一种替代子类化的方法。
id
id可以持有任何类型的对象。
id<GAITracker> tracker
这意味着tracker是一个id类型的对象,可以持有符合 GAITracker
协议的对象。
1. id类型被设计为一种通用类型,可以容纳任何对象类型(换句话说,id不能与原始类型(如int和BOOL)一起使用)。
2. 想象一下,你有一个处理外部数据的类。你不知道或不关心数据来自哪里,但你应该准备处理许多不同类型的数据。你的数据可能来自文本文件,其中内容可能会被读取并作为NSString传递到你的方法中。你可能需要在自己程序的其他地方处理数据,那么数据就会变成NSArray或NSSet。或者,数据可能来自互联网作为JSON响应,必须将其解析为NSDictionary(如果你不知道JSON是什么,不要担心,后面会有相关介绍)。
- (void)processData:(id)someData {
if ([someData isKindOfClass:[NSString 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);
}
您可以通过此链接获取更多详细信息 http://www.binpress.com/tutorial/learn-objectivec-objects-part-8-dynamic-typing/68
tracker
是一个符合GAITracker
协议 的对象。请参阅 Core Competencies 文档中的协议讨论。 - Rob