【问题标题】:NSManagedObject sharedInstanceNSManagedObject 共享实例
【发布时间】:2026-01-21 23:50:02
【问题描述】:

我正在尝试使我的类“用户”成为 NSManagedObject 并同时成为 sharedInstance。但是,当我调用我的[User sharedInstance] 时,我得到 CoreData:错误:无法调用 NSManagedObject 类“用户”上的指定初始化程序

是否可以将 NSManagedObject 视为常规 NSObject 并在其上具有自定义属性和方法?

用户.h

@interface User : NSManagedObject

@property (nonatomic, retain) NSString *Id;
@property (nonatomic, retain) NSString *lastName;
@property (nonatomic, retain) NSString *firstName;
@property (nonatomic, assign) BOOL isLoggedIn;

+ (instancetype)currentUser;

用户.m

@synthesize Id;
@synthesize lastName;
@synthesize firstName;
@synthesize isLoggedIn;

+ (instancetype)currentUser {
    static id sharedInstance = nil;
    static dispatch_once_t t;
    dispatch_once(&t, ^{
        sharedInstance = [[self alloc] init];
    });

    return sharedInstance;
}

【问题讨论】:

    标签: ios core-data singleton nsmanagedobject nsobject


    【解决方案1】:

    我不认为 managed objectsingleton 习惯用法混合得很好。它们还具有本质上不同的目的,也许这就是原因。

    您需要从应用中的任何位置访问当前用户。这是一个很常见的用例。一个经过良好测试且干净的方法是在应用程序委托(或您的核心数据堆栈类)中保留对对象的引用。我个人更喜欢在 NSUserDefaults 中存储一些唯一 ID,并从类或应用委托中动态返回 currentUser

    请注意,如果您使用背景上下文,您可能需要同一“当前用户”的多个实例(单例模式不适合的另一个原因)。一种方便的方法是使用class 方法,该方法采用上下文和唯一标识符并返回适当的User 对象。

    【讨论】:

      【解决方案2】:

      查看NSManagedObject- initWithEntity:insertIntoManagedObjectContext: 的文档

      重要此方法是指定的初始化器 NSManagedObject。您不能简单地通过以下方式初始化托管对象 发送它初始化。

      【讨论】: