具有类别和委托的 NSManagedObject

NSManagedObject with Category and Delegate

我创建了一个名为 MapState 的 NSManagedObject。然后我为它创建了一个类别来调用一些方法并存储一些额外的变量。

.h #import "MapStateDB.h"

@protocol MapStateDelegate;

@interface MapStateDB (MapState)

@property (weak, nonatomic) id <MapStateDelegate> delegate;

-(void)selectedSceneObject:(SceneObject *)sceneObject;
-(void)removeDisplayedScene;

@end


@protocol MapStateDelegate <NSObject>

-(void)displayScene:(SceneDB *)scene inState:(NSString *)state;
-(void)removeScene:(SceneDB *)scene;

@end

在.m:

@dynamic delegate;

-(void)setDelegate:(id<MapStateDelegate>)delegate {

}

我该怎么做setter?通常它只是:

-(void)setDelegate:(id<MapStateDelegate>)delegate {
    _delegate = delegate;
}

但是由于变量是 @dynamic 而不是 @synthesize,所以没有创建 _delegate@synthesize 会产生错误。

我该如何处理?

使用 @dynamic 意味着将在 运行 时创建适当的访问器。 NSManagedObject 对数据模型中实体的属性执行此操作,但不对您声明的属性执行此操作。您 可以 使用一些 ObjC 运行 时间魔法来做到这一点(所有 API 都存在并且受到支持,所以这不是所谓的 hack),但这并非微不足道。 (如果 delegate 是实体上的瞬态 属性,则使用 @dynamic 会很好,但这意味着委托必须是 Core Data 支持的类型之一,而不是任何class 实施协议)。

但还是有希望的!如果您使用 Xcode 7+ 生成 NSManagedObject subclasses,则可以安全地在 subclass 中添加您自己的属性,而不必担心它们被覆盖。您可以通过为 delegate 属性 添加 @synthesize 然后不添加您自己的 setter 来使其工作。您不必提供一个,除非您需要做的不仅仅是设置 属性 值。

如果您 需要自定义 setter,请将 @synthesize 修改为

@synthesize delegate = _delegate;

(你不必在这里使用_delegate,任何有效的名称都可以)

然后添加一个 setter,就像您问题中分配给合成名称的那个。