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

Posted

技术标签:

【中文标题】带有来自基本控制器中 AppDelegate 的核心数据对象上下文的 SIGABRT【英文标题】:SIGABRT with core data object context from AppDelegate in base controller 【发布时间】:2012-04-24 08:12:08 【问题描述】:

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

标题:

#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】:

你不应该使用 strong 属性,因为 strong 应用于 setter 并且你有一个只读属性。

【讨论】:

好吧,我现在只是习惯了强/弱。对于严重依赖 GC 的 C# 程序员来说,这是全新的体验。 好的,谢谢。我已经更改了它(并在上面进行了编辑),但错误仍然存​​在。这可能与应用程序委托代码有关吗? (只是从 Master Detail 模板项目减去将上下文提供给 MasterViewController 的顶部方法)。 只是(只读,非原子),weak 也指的是setter。而且您不需要 appDelegate 属性,因为您可以从任何地方访问它。 尝试:_managedObjectContext = [self.appDelegate.managedObjectContext retain];我如何处理这种情况是创建一个类来处理与 Core Data 相关的所有内容并使其成为单例。 它是单例模式,在阅读了它之后,它看起来是一个更好的方法。

以上是关于带有来自基本控制器中 AppDelegate 的核心数据对象上下文的 SIGABRT的主要内容,如果未能解决你的问题,请参考以下文章

来自 AppDelegate 的 PresentViewController 句柄ActionWithIdentifier

来自 AppDelegate 的当前 viewController 崩溃/空屏

AppDelegate 被不同的类访问,来自 RootController.m

在 AppDelegate 中动画后不显示根视图控制器

无法从 appdelegate 推送视图控制器

从 AppDelegate 影响视图