使用#define访问App Delegate对象不起作用

时间:2012-05-04 11:56:08

标签: iphone objective-c

我在不同的类中使用App Delegate对象。我希望在整个项目中访问它。我在Prefix.pch文件中将此对象定义为

#define Appdelegate (AppDelegate *)[[UIApplication sharedApplication] delegate]

但问题是Appdelegate变量不能访问App委托变量。 它显示错误。

但如果我使用此代码工作正常

AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
appDelegate.variablename;

我做得对吗还是有办法做我做的事情?

先谢谢。

3 个答案:

答案 0 :(得分:15)

应该是:

#define Appdelegate ((AppDelegate *)[[UIApplication sharedApplication] delegate])
//                  ^----------------------parenthesis--------------------------^

答案 1 :(得分:1)

正如这个问题及其答案所示,依靠预处理器通常是一个坏主意。

  1. 很容易弄错。我们都为运算符优先级培养了良好的直觉,但预处理器没有任何线索。为了抵御意外的背景问题,你经常需要将所有内容包装在额外的支撑和支撑中。

  2. 当代码执行另一个代码时,很容易让自己相信自己正在做一件事。当事情中断时,编译器的错误消息和调试器都不会有太大帮助。

  3. 最重要的是,预处理器可以让你采取一个坏主意,并在整个程序中普及。这里的坏主意是全局使用App Delegate。

  4. 全局变量是代码气味。通过将全局变量填充到预编译头中来使全局变量更加全局化的努力是一种代码味道。如果框架认为你应该从任何地方访问AppDelegate,你就不需要跳过这些(适度的)箍!

    所以,当试图做这样的事情时,很高兴知道预处理器在那里并且pch头部在那里,但请记住,你正在与框架作斗争,几乎肯定会产生设计错误。在您的上下文中可能没问题,但这是值得了解的。

答案 2 :(得分:1)

您需要在声明委托宏的地方导入AppDelegate文件:

#import "AppDelegate.h"

然后定义

#define Appdelegate (((AppDelegate *)[[UIApplication sharedApplication] delegate]))