Objective-C中的id<...>是什么意思?

24

我正在尝试在iOS应用中使用Google Analytics,我看到了以下代码:

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

作为iOS开发的初学者,我不知道id<GAITracker> trackerGAITracker *tracker之间有什么区别。我在Google上搜索了但没有找到解释。能否有人为我澄清一下?


6
这意味着 tracker 是一个符合 GAITracker 协议 的对象。请参阅 Core Competencies 文档中的协议讨论 - Rob
5个回答

31

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

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

因此,即使它没有一个特定的类,您仍然可以调用由该协议声明的方法和属性。


谢谢,现在非常清楚了 :) 当可以时,我会接受你的答案。 - Mohamed Amine

3

这里的 id 是一个保持对象的指针。

tracker 是一个遵循 GAITracker 协议的实例。

协议使得两个通过继承远相关的类可以相互通信以完成某个目标,因此它们提供了一种替代子类化的方法。


2
当你使用"id"时,它就像void*一样,你知道它是一个指针,但你不知道它的类型。 当你使用""时,你意味着该对象实现了MyProtocol。你不知道对象的类型,它可以是NSObject、UIViewController,你并不在意。你只想要这个对象实现一组协议。 最后,GAITracker表示对象的类型是GAITracker。

1

id

id可以持有任何类型的对象。

id<GAITracker> tracker

这意味着tracker是一个id类型的对象,可以持有符合 GAITracker 协议的对象。


0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接