使用[[[UIApplication sharedApplication]委托] myClass属性]时编译器警告“在协议中找不到”?

时间:2009-05-12 23:49:04

标签: cocoa-touch objective-c-runtime

我的appDelegate实例化了myClass,我有另一个类,myClass实例化了newClass。从newClass实例,我想访问创建它的myClass实例中的属性。我这样做了:

[[[UIApplication sharedApplication].delegate myClass] property]

这很有效,我实际上可以获得该属性但是我从Xcode收到了这个警告:

warning: "-myClass" not found in protocols
warning: no "-myClass" method found  
(messages without a matching signature will be assumed to return "id" and accept "..." as arguments)

new.class属性已在.h和.m文件中正确声明,它的属性已设置并已合成。

它编译并运行,我实际上可以获得该属性的值。

我应该忽略Xcode中的警告吗?

有没有更好的方法来访问myClass实例的属性?

2 个答案:

答案 0 :(得分:4)

查看 - [UIApplication delegate]的文档。请注意,它的返回类型为:

id <UIApplicationDelegate>

因此,您对退回对象的所有了解都是符合此协议的。然后,假设代表响应-myClass消息,而不是编译器愿意做出的消息,这就是信念的飞跃。

你可以稍微破解它,就像这样工作:

[[(MyAppDelegateClass *)[[UIApplication sharedApplication] delegate] myClass] property]

但这将是不好的做法。相反,我建议你让你的应用程序委托一个单身人士,你可以这样做:

[[[MyAppDelegateClass sharedApplicationDelegate] myClass] property]

答案 1 :(得分:0)

我认为在编译时Xcode无法实现属性和普通Objective-C的飞跃。它无法找到属性,所以只是假设你知道你在做什么并填补空白。在运行时,事情显然是可以的。

请改为尝试:

[[[[UIApplication sharedApplication] delegate] myClass] property];

顺便说一下,所以你自己的代码中没有这样的代码,我通常会在app delegate的标题中执行#define:

#define APPDELEGATE (myAppDelegate *)[[UIApplication sharedApplication] delegate]

然后在代码中我可以去:

[[APPDELEGATE myClass] property];