什么是id<>变量,并自动初始化?

时间:2014-09-06 10:27:18

标签: objective-c variables delegates initialization

我目前正在使用API​​(Insiteo),要求我使用id<ISPInitListener>。它告诉我在初始化函数中使用它:

id<ISPCancelable> initTask = [[ISInitProvider instance] startAPIWithServerType:ISEServerTypeProd andSiteId:SITE_ID andLanguage:LANGUAGE andInitListener:aListener];

a&#39; aListener&#39;是id<ISPInitListener>。我可以看到ISPInitListenerNSObject,但实际上并不知道在此功能中初始化/使用它的最佳方法?任何人都可以解释这些对象是如何工作的吗?

我目前在ISPInitListener添加了@interface LONetworkLocationManager () <UITextViewDelegate, UIAlertViewDelegate, ISPInitListener>,但与ISP相关的代理功能永远不会被调用。

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

id是一种特殊类型,在Objective-C中表示“任何对象类型”。

角括号用于表示协议一致性。

将两者放在一起,id<ISPInitListener>表示“任何符合ISPInitListener协议的对象”。

这通常用于指示委托对象的类型,在该类型中,您不关心对象的特定类型,而只关注与定义特定委托的协议的一致性,在本例中为{{ 1}}。

答案 1 :(得分:0)

好的,我想我在http://unixjunkie.blogspot.co.uk/2008/03/id-vs-nsobject-vs-id.html找到了答案:

  

将对象声明为id告诉编译器您不关心对象是什么类型,但您确实知道它符合指定的NSObject协议**。编译器将确保您分配给该指针的所有对象都符合所需的协议。像这样输入的指针可以安全地保存任何NSObject(因为NSObject符合NSObject协议),但它也可以保存任何NSProxy,因为NSProxy也符合NSObject协议。在英语中,声明id为foo3;说“foo3是指向任何类型的对象的指针,其行为类似于NSObject”。这是非常强大,方便和富有表现力的。实际上,我们通常不关心对象是什么类型,我们只关心它响应我们想要发送它的消息(例如,保留,释放)。