7

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

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

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

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

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

我这样做是正确的还是有办法做我所做的?

提前致谢。

4

3 回答 3

15

应该:

#define Appdelegate ((AppDelegate *)[[UIApplication sharedApplication] delegate])
//                  ^----------------------parenthesis--------------------------^
于 2012-05-04T11:57:56.153 回答
1

正如这个问题及其答案所表明的那样,依赖预处理器通常是一个坏主意。

  1. 很容易出错。我们都对运算符优先级产生了良好的直觉,但预处理器却毫无头绪。为了防止意外的上下文问题,您通常需要将所有内容都包含在额外的括号和大括号中。

  2. 当代码在做另一件事时,很容易说服自己你在做一件事。当事情中断时,编译器的错误消息和调试器都不太可能有太大帮助。

  3. 最重要的是,预处理器可以让你接受一个坏主意并在程序中广泛传播。这里的坏主意是全局使用 App Delegate。

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

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

于 2013-03-22T14:10:07.503 回答
1

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

#import "AppDelegate.h"

然后定义

#define Appdelegate (((AppDelegate *)[[UIApplication sharedApplication] delegate]))
于 2015-08-30T09:44:57.190 回答