22

我正在尝试在 iOS 应用程序中使用 Google Analytics,我看到了这部分代码:

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

id<GAITracker> tracker作为 iOS 开发的初学者,我不知道和之间有什么区别GAITracker *tracker。我在谷歌搜索它,但没有找到解释。有人可以为我澄清一下吗?

4

5 回答 5

29

<> 表示对象符合方括号内的协议(pr 协议)。

在您的示例中,对象tracker可以是任何类型的对象,但它符合GAITracker协议。

因此,尽管它没有特定的类,您仍然可以在其上调用由该协议声明的方法和属性。

于 2013-11-06T12:49:54.303 回答
2

这里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.

于 2013-11-06T13:02:11.413 回答
1

ID

id 可以保存任何类型的对象。

id<GAITracker> tracker

这意味着跟踪器是一个 id 类型的对象,它可以保存那些确认GAITracker协议的对象

于 2013-11-06T12:50:23.770 回答
1

当你使用“id”时,它就像 void *,你知道它是一个指针,但你不知道它的类型。当您使用时,您的意思是该对象确实实现了 MyProtocol。你不知道对象的类型,可以NSObject,UIViewController,你不用管。您只希望对象实现一组协议。最后,GAITracker 表示对象的类型是 GAITracker。

于 2013-11-06T12:50:33.917 回答
0

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

于 2015-08-13T06:33:35.363 回答