带有来自基本控制器中 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 崩溃/空屏