1

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

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

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

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

这样做有什么问题吗?这是不好的编程习惯吗?

4

4 回答 4

5

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

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

这将使您的应用程序委托可以从代码中的任何位置访问,并且不会与任何名为appDelegate.

于 2012-05-01T03:48:42.040 回答
2

NSObjectUIApplication与其委托人没有任何有意义的联系。从设计的角度来看,我认为这样做是一种糟糕的黑客行为。我可以想到其他三种解决方案,我认为它们会好几百万倍:

  1. 函数,其声明位于由您的前缀标头导入的标头中。

  2. 类别 on UIApplication,它实际上是一个与您尝试执行的操作有关的类。

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

  4. (四种解决方案!)指向应用程序委托的全局指针。

有关实现 3 或 4 的信息,请参阅关于延迟实例化和便利方法


*真的不明白他们为什么不在 iOS 上这样做。

于 2012-05-01T04:08:48.277 回答
2

我通常使用全局变量来指向应用程序委托。

在 MyAppDelegate.h 中:

extern MyAppDelegate* AppDelegate;

在 MyAppDelegate.m 中:

MyAppDelegate* AppDelegate = nil;

- (id)init {
    if (self = [super init]) {
        AppDelegate = self;
        …
    }
}

现在任何导入“MyAppDelegate.h”的人都可以使用该AppDelegate变量来访问您的应用程序委托。

于 2012-05-01T04:15:12.537 回答
0

当然它是安全的,只要你知道苹果在不久的将来不会或不会有一个名为 appDelegate 的方法。子类化是首选方法,尤其是因为 NSObject 是根类。但是,这需要课堂摆姿势,这在 OSX 10.5+ 中已完全弃用,甚至在 iOS 设备上也不是可行的选择。

于 2012-05-01T03:40:31.417 回答