我正在尝试在iOS应用程序中使用Google Analytics,我看到了这部分代码:
id<GAITracker> tracker = [[GAI sharedInstance] defaultTracker];
作为iOS开发的初学者,我不知道id<GAITracker> tracker
和GAITracker *tracker
之间的区别。我在谷歌搜索过它,但没有找到解释。有人可以为我澄清一下吗?
答案 0 :(得分:19)
&lt;&gt;表示该对象符合方括号内的协议(pr协议)。
在您的示例中,对象tracker
可以是任何类型的对象,但它符合GAITracker
协议。
因此,虽然它没有特定的类,但您仍然可以调用该协议声明的方法和属性。
答案 1 :(得分:1)
<强> ID 强>
id可以容纳任何类型的对象。
<强> id<GAITracker> tracker
强>
这意味着跟踪器是一个id类型对象,它可以保存那些确认为GAITracker
协议的对象
答案 2 :(得分:1)
当你使用“id”时它就像void *,你知道它是一个指针,但你不知道它的类型。 当你使用时,你的意思是该对象确实实现了MyProtocol。你不知道对象的类型,它可以是NSObject,UIViewController,你不在乎。您只希望该对象实现一组协议。 最后,GAITracker意味着对象的类型是GAITracker。
答案 3 :(得分:1)
此处 id 是一个包含对象的指针。
和跟踪器是符合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.
答案 4 :(得分:1)
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