符合协议ID,是否需要?

时间:2012-09-25 11:46:18

标签: iphone objective-c cocoa-touch

我刚刚查看了一些旧代码,它让我思考其中的哪些代码使用,两者似乎都没有抱怨。当我发现差异时,我很好奇。

此:

id <UIApplicationDelegate> appDelegate = [[UIApplication sharedApplication] delegate];

OR

id appDelegate = [[UIApplication sharedApplication] delegate];

3 个答案:

答案 0 :(得分:2)

我想这取决于你对appDelegate的要求

我的意思是,如果您要使用该物业&#34; window&#34;在UIApplicationDelegate协议中定义:

NSLog(@"%@",  appDelegate.window);

然后你应该使用:

id <UIApplicationDelegate> appDelegate = [[UIApplication sharedApplication] delegate];

但如果你尝试:

id appDelegate = [[UIApplication sharedApplication] delegate];
NSLog(@"%@",  appDelegate.window);

你会收到错误......

答案 1 :(得分:2)

虽然meronix的答案是正确的,但它错过了重要的一点。

您应该始终声明变量以使其具有最具体的类型。

通过这样做,您可以为编译器提供用于验证代码的最大信息量。因此,这是首选,因为它告诉编译器将选择器的搜索限制为最小数字:

id <UIApplicationDelegate> appDelegate = ...;

请注意,id<SomeProtocol>将有效选择器集限制为 SomeProtocol中存在的选择器。这就是为什么你有时会看到声明为同时实现<NSObject>的协议,或者你会看到id<SomeProtocol, NSObject>(或NSObject<SomeProtocol>*)作为类型声明。

答案 2 :(得分:0)

试试这个..

YourAppDelegate *appDelegate = (YourAppDelegate *)[[UIApplication sharedApplication]delegate];

避免任何形式的警告