我正在尝试在 iOS 应用程序中使用 Google Analytics,我看到了这部分代码:
id<GAITracker> tracker = [[GAI sharedInstance] defaultTracker];
id<GAITracker> tracker
作为 iOS 开发的初学者,我不知道和之间有什么区别GAITracker *tracker
。我在谷歌搜索它,但没有找到解释。有人可以为我澄清一下吗?
我正在尝试在 iOS 应用程序中使用 Google Analytics,我看到了这部分代码:
id<GAITracker> tracker = [[GAI sharedInstance] defaultTracker];
id<GAITracker> tracker
作为 iOS 开发的初学者,我不知道和之间有什么区别GAITracker *tracker
。我在谷歌搜索它,但没有找到解释。有人可以为我澄清一下吗?
<> 表示对象符合方括号内的协议(pr 协议)。
在您的示例中,对象tracker
可以是任何类型的对象,但它符合GAITracker
协议。
因此,尽管它没有特定的类,您仍然可以在其上调用由该协议声明的方法和属性。
这里id是一个保存对象的指针。
而 tracker是一个符合GAITracker
协议的实例。
Protocols make it possible for two classes distantly related by inheritance to communicate with each other to accomplish a certain goal. They thus offer an alternative to subclassing.
ID
id 可以保存任何类型的对象。
id<GAITracker> tracker
这意味着跟踪器是一个 id 类型的对象,它可以保存那些确认GAITracker
协议的对象
当你使用“id”时,它就像 void *,你知道它是一个指针,但你不知道它的类型。当您使用时,您的意思是该对象确实实现了 MyProtocol。你不知道对象的类型,可以NSObject,UIViewController,你不用管。您只希望对象实现一组协议。最后,GAITracker 表示对象的类型是 GAITracker。
1. id 类型被设计为可以容纳任何对象类型的泛型类型(换句话说,id 不适用于原始类型,例如 ints 和 BOOLs)。
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