目前我使用此代码,当我需要app delegate的本地方法级实例时:
AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
是不是有某种更简单的“全球”方式来访问它?
在C#等其他语言中,您可以创建公共静态类,只需说出......
if (ObjectHelper.isLoggedin)
{
//Do Work
}
然而,当我想使用app delegate时,我发现在objective-c中有点令人沮丧,我必须:
在标题中导入它,实例化它的本地实例,实际得到一个 我需要的全球国家财产
在你说“不要使用app delegate”之前,即使我创建了自己的静态类,并且我想为共享应用程序创建一个实例,我仍然必须将我自己的静态类放在app delegate中如果我想在视图控制器之间共享它,对吧?!?!?!
我缺少什么,这看起来很蹩脚......,你如何以更简单的方式管理全局常量,设置等?或者你只需要导入/创建应用程序委托参考每一个时间???
感谢!!!
答案 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;
创建课程'经理'作为单线类使用此类来访问应用程序中的任何位置的全局数据。
最重要的是在-prefix.h中添加此Manager.h。这将确保此类在整个应用程序中可用。 根据我的想法,它简单而干净的方式
希望它有所帮助!!!