我经常需要访问我的核心数据管理对象上下文,而不是每次都在每个类中获取[[UIApplication sharedApplication] delegate]
的实例并将其存储在变量中,我想知道是否可以这样做这样:
@interface NSObject(DelegateExtension)
- (AppDelegate*)appDelegate;
@end
@implementation
NSObject(DelegateExtension)
- (AppDelegate*)appDelegate
{
return (AppDelegate*)[[UIApplication sharedApplication] delegate];
}
@end
所以我可以在我的代码中的任何地方self.appDelegate
。
这样做有什么不妥,可能一夜之间显而易见吗?这是不好的编程习惯吗?
答案 0 :(得分:5)
或者,您可以将预处理器宏(或静态C函数)添加到Prefix.pch
文件中:
#define AppDelegateInstance() (AppDelegate *)[[UIApplication sharedApplication] delegate]
这将使您的应用委托可以从代码中的任何位置访问,并且不存在与任何名为appDelegate
的现有方法冲突的可能性。
答案 1 :(得分:2)
NSObject
与UIApplication
或其代理没有任何有意义的联系。从设计的角度来看,我认为这样做会是一种糟糕的黑客攻击。还有其他三种解决方案,我认为可以提出数百万倍的优势:
功能,其声明位于由前缀标题导入的标题中。
UIApplication
上的类别,实际上是与您尝试采取的操作有关的类。
全局指针,如OS X *上的NSApp
,它被设置为程序中指向UIApplication
实例的第一件事。
(四种解决方案!)指向应用代表的全局指针。
有关实施3或4的信息,请参阅On lazy instantiation and convenience methods。
*真的不明白他们为什么不在iOS上这样做。
答案 2 :(得分:2)
我通常使用全局变量指向应用程序委托。
在MyAppDelegate.h中:
extern MyAppDelegate* AppDelegate;
在MyAppDelegate.m中:
MyAppDelegate* AppDelegate = nil;
- (id)init {
if (self = [super init]) {
AppDelegate = self;
…
}
}
现在,任何导入“MyAppDelegate.h”的人都可以使用AppDelegate
变量来访问您的应用代理。
答案 3 :(得分:0)
当然它是安全的,只要你知道苹果在不久的将来没有或者没有名为appDelegate的方法。子类是首选方法,特别是因为NSObject是一个根类。但是,这需要上课,在OSX 10.5+中完全不赞成使用,甚至在iOS设备上都不可行。