NSObject上的类别来获取AppDelegate的实例?

时间:2012-05-01 03:32:57

标签: objective-c ios cocoa-touch

我经常需要访问我的核心数据管理对象上下文,而不是每次都在每个类中获取[[UIApplication sharedApplication] delegate]的实例并将其存储在变量中,我想知道是否可以这样做这样:

@interface NSObject(DelegateExtension)
- (AppDelegate*)appDelegate;
@end

@implementation 
NSObject(DelegateExtension)
- (AppDelegate*)appDelegate
{
    return (AppDelegate*)[[UIApplication sharedApplication] delegate];
}
@end

所以我可以在我的代码中的任何地方self.appDelegate

这样做有什么不妥,可能一夜之间显而易见吗?这是不好的编程习惯吗?

4 个答案:

答案 0 :(得分:5)

或者,您可以将预处理器宏(或静态C函数)添加到Prefix.pch文件中:

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

这将使您的应用委托可以从代码中的任何位置访问,并且不存在与任何名为appDelegate的现有方法冲突的可能性。

答案 1 :(得分:2)

NSObjectUIApplication或其代理没有任何有意义的联系。从设计的角度来看,我认为这样做会是一种糟糕的黑客攻击。还有其他三种解决方案,我认为可以提出数百万倍的优势:

  1. 功能,其声明位于由前缀标题导入的标题中。

  2. UIApplication上的类别,实际上是与您尝试采取的操作有关的类。

  3. 全局指针,如OS X *上的NSApp,它被设置为程序中指向UIApplication实例的第一件事。

  4. (四种解决方案!)指向应用代表的全局指针。

  5. 有关实施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设备上都不可行。