为什么每次我需要使用它时都要不断实例化appdelegate?

时间:2014-06-19 05:39:46

标签: ios objective-c

目前我使用此代码,当我需要app delegate的本地方法级实例时:

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

是不是有某种更简单的“全球”方式来访问它?

在C#等其他语言中,您可以创建公共静态类,只需说出......

if (ObjectHelper.isLoggedin)
{
   //Do Work
}

然而,当我想使用app delegate时,我发现在objective-c中有点令人沮丧,我必须:

在标题中导入它,实例化它的本地实例,实际得到一个         我需要的全球国家财产

在你说“不要使用app delegate”之前,即使我创建了自己的静态类,并且我想为共享应用程序创建一个实例,我仍然必须将我自己的静态类放在app delegate中如果我想在视图控制器之间共享它,对吧?!?!?!

我缺少什么,这看起来很蹩脚......,你如何以更简单的方式管理全局常量,设置等?或者你只需​​要导入/创建应用程序委托参考每一个时间???

感谢!!!

4 个答案:

答案 0 :(得分:7)

嗯,首先,让我们澄清一些误解。

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

这不是实例化任何东西。让我们稍微分解一下。

[UIApplication sharedApplication]

这是对UIApplication上的类方法的调用。 UIApplication返回一个已存在的UIApplication *类型的值,它是在app启动时间接从main.m创建的。让我们调用此调用的结果" a":

UIApplication *a = [UIApplication sharedApplication]

现在让我们看看下一层。

[a delegate]

这实际上就是你所说的,我只是将其分解为更清晰。您正在访问UIApplication实例上的delegate属性。这将返回一个已分配的指向实现UIApplicationDelegate协议的类的指针。在这种情况下,它是你的类AppDelegate,它直接在你的main.m的main()函数中分配。 (去看看,你应该看到一个包含这个的宏!)

现在,解决你的问题。

您基本上希望从项目的任何位置访问AppDelegate类的此实例。这需要两件事。首先,任何想要与AppDelegate *交谈的文件都必须导入AppDelegate.h。其次,如果您想要访问较短的属性,则需要在某处分配,或者在全局范围内分配。

对于第一个问题,您只需在预编译的头文件中导入" AppDelegate.h即可。搜索您的项目" .pch"文件。在编译代码时,它包含在每个.m的顶部。

添加以下行:

#import "AppDelegate.h"

现在,项目中的每个人都可以看到这个!

要解决第二部分,我有一个更好的解决方案。由于对sharedApplication的原始调用工作得很好,所以只需#define快捷方式即可!在同一个.pch文件中,添加:

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

现在,在您的应用中的任何位置,您都可以调用AppDelegate来获取访问权限。现在,这是否聪明是有争议的,但你说你想要这种力量。

答案 1 :(得分:1)

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

此行并不意味着您正在创建本地实例。您只是访问[UIApplication sharedApplication] singleton的委托实例的引用。

答案 2 :(得分:1)

AppDelegate是一个单身人士。

每次都没有初始化它,而是调用返回单例对象的静态方法。

为了满足您的要求,您可以使用以下方法:

1。您可以使用#define定义宏快捷方式,如:

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

2. 您可以定义一个静态方法,如:

+ (AppDelegate *)getAppDelegate
{
   return (AppDelegate *)[[UIApplication sharedApplication] delegate];
}

答案 3 :(得分:0)

#define kSingleton                            static id shared; static dispatch_once_t done; dispatch_once(&done, ^{shared = [self new];}); return shared;
  • (id)sharedManager {kSingleton} //创建单一实例的方法

创建课程'经理'作为单线类使用此类来访问应用程序中的任何位置的全局数据。

最重要的是在-prefix.h中添加此Manager.h。这将确保此类在整个应用程序中可用。 根据我的想法,它简单而干净的方式

希望它有所帮助!!!