带有来自基本控制器中AppDelegate的核心数据对象上下文的SIGABRT

时间:2012-04-24 08:12:08

标签: iphone objective-c core-data ios5 nsmanagedobject

我意识到最好的做法是从应用程序中的第一个控制器传递一个对象上下文,但是假设我的应用程序以导航控制器开始,并且有一些视图控制器只是内容而且不需要核心数据我认为这个将是一个更简单的解决方案。

部首:

#import <UIKit/UIKit.h>
#import "AppDelegate.h"

@interface CoreDataViewController : UIViewController
- (void)saveContext;

//See ggfela's answer
//@property (readonly, strong, nonatomic) AppDelegate *appDelegate;
//@property (readonly, strong, nonatomic) NSManagedObjectContext *managedObjectContext;

@property (readonly, weak, nonatomic) AppDelegate *appDelegate;
@property (readonly, weak, nonatomic) NSManagedObjectContext *managedObjectContext;

@end

实现:

#import "CoreDataViewController.h"

@implementation CoreDataViewController

@synthesize appDelegate = _appDelegate;
@synthesize managedObjectContext = _managedObjectContext;

-(AppDelegate *)appDelegate
{
    if(!_appDelegate) {
        _appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
    }

    return _appDelegate;
}

-(NSManagedObjectContext *)managedObjectContext
{
    if(!_managedObjectContext) {
        _managedObjectContext = self.appDelegate.managedObjectContext;
    }

    return _managedObjectContext;
}

- (void)saveContext
{
    [self.appDelegate saveContext];
}

@end

当我从这个类继承然后尝试访问托管对象上下文时,我收到一个SIGABRT错误,我收集这意味着某处可能存在内存泄漏。我对Objective-C很新,所以对调试它不太了解。

任何人都可以告诉我我做错了什么。

我是否应该以其他方式(即从控制器向子控制器传递上下文)这样做,并且苹果可能会阻止我的应用程序?

1 个答案:

答案 0 :(得分:1)

您不应该使用strong属性,因为在setter上应用了strong,并且您具有只读属性。