fab*_*789 0 iphone singleton core-data objective-c
我刚注意到我的iPhone/iPad应用程序中存在一个相当严重的错误:我有一个叫做AppDelegate实现UIApplicationDelegate协议的类- 就像每个iPhone应用程序一样.我正在使用Core Data,并AppDelegate设置我的托管对象上下文(我大多只是保留了Xcode模板的默认方法).
现在我需要在我的应用程序中的几个地方使用托管对象上下文,我还想-saveContext从几个地方调用该方法.所以我使用了单例模式并添加了一个类方法+ (AppDelegate *)sharedAppDelegate,它实现如下:
+ (AppDelegate *)sharedAppDelegate
{
static dispatch_once_t pred = 0;
__strong static id _sharedObject = nil;
dispatch_once(&pred,^{
_sharedObject = [[self alloc] init];
});
return _sharedObject;
}
Run Code Online (Sandbox Code Playgroud)
到目前为止一切正常.但是现在,我试图访问sharedAppDelegate的UIWindow属性,发现它nil.起初我很困惑,但后来我意识到,首先我的main方法创建了一个实例AppDelegate,它创建了UIWindow视图控制器-application:didFinishLaunchingWithOptions:,然后-sharedAppDelegate创建另一个!我发现很奇怪我的应用程序到目前为止似乎工作得很好,因为例如只有第一个实例-saveContext在应用程序存在时调用.
无论如何,我想改变它,以便该main方法也使用sharedAppDelegate.这是否意味着我需要覆盖该-init方法?如何防止无限循环(-sharedAppDelegate毕竟还是calles init)?我应该制作_sharedObject全球范围的变量吗?
您不创建自己的应用程序委托实例.UIKit Framework在应用程序启动时为您创建一个.您可以从delegateUIApplication上的方法获取当前的应用程序委托.因此,当您想要获取共享的托管对象上下文时:
// Get the instance of your delegate created by the framework when the app starts
AppDelegate* appDelegate = (AppDelegate*)[[UIApplication sharedApplication] delegate];
// Assuming you're using the default methods from the template...
NSManagedObjectContext* context = [appDelegate managedObjectContext];
Run Code Online (Sandbox Code Playgroud)
您始终可以使用该sharedApplication方法获取当前单例UIApplication,并且您始终可以使用delegate应用程序实例上的方法获取应用程序委托的正确实例.
| 归档时间: |
|
| 查看次数: |
267 次 |
| 最近记录: |