我刚刚查看了一些旧代码,这让我开始思考要使用其中的哪一个,它们似乎都可以毫无怨言地工作。当我发现差异时,我只是好奇。
这个:
id <UIApplicationDelegate> appDelegate = [[UIApplication sharedApplication] delegate];
或者
id appDelegate = [[UIApplication sharedApplication] delegate];
我刚刚查看了一些旧代码,这让我开始思考要使用其中的哪一个,它们似乎都可以毫无怨言地工作。当我发现差异时,我只是好奇。
这个:
id <UIApplicationDelegate> appDelegate = [[UIApplication sharedApplication] delegate];
或者
id appDelegate = [[UIApplication sharedApplication] delegate];
虽然 meronix 的答案是正确的,但它错过了一个重要的点。
您应该始终将变量声明为尽可能具有最具体的类型。
通过这样做,您可以为编译器提供最大数量的信息来验证您的代码。因此,这是更可取的,因为它告诉编译器将对选择器的搜索限制为最小数量:
id <UIApplicationDelegate> appDelegate = ...;
请注意,id<SomeProtocol>
将有效选择器集限制为仅存在于SomeProtocol
. 这就是为什么您有时会看到协议声明为也在实现<NSObject>
,或者您会看到id<SomeProtocol, NSObject>
(或NSObject<SomeProtocol>*
)作为类型声明。
我想这取决于你对 appDelegate 的要求
我的意思是,如果您要使用 UIApplicationDelegate 协议中定义的属性“窗口”:
NSLog(@"%@", appDelegate.window);
那么你应该使用:
id <UIApplicationDelegate> appDelegate = [[UIApplication sharedApplication] delegate];
但如果你尝试:
id appDelegate = [[UIApplication sharedApplication] delegate];
NSLog(@"%@", appDelegate.window);
你会得到一个错误...
尝试这个..
YourAppDelegate *appDelegate = (YourAppDelegate *)[[UIApplication sharedApplication]delegate];
避免任何形式的警告