0

我刚刚查看了一些旧代码,这让我开始思考要使用其中的哪一个,它们似乎都可以毫无怨言地工作。当我发现差异时,我只是好奇。

这个:

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

或者

id appDelegate = [[UIApplication sharedApplication] delegate];
4

3 回答 3

2

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

您应该始终将变量声明为尽可能具有最具体的类型。

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

id <UIApplicationDelegate> appDelegate = ...;

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

于 2012-09-25T16:20:29.413 回答
2

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

我的意思是,如果您要使用 UIApplicationDelegate 协议中定义的属性“窗口”:

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

那么你应该使用:

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

但如果你尝试:

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

你会得到一个错误...

于 2012-09-25T11:54:05.037 回答
0

尝试这个..

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

避免任何形式的警告

于 2012-09-25T12:20:06.737 回答