具有类别和委托的NSManagedObject

时间:2015-11-20 16:01:40

标签: objective-c core-data nsmanagedobject

我创建了一个名为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 {

}

我如何做二传手?通常它只是:

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

但由于变量为@dynamic而非@synthesize,因此不会创建_delegate@synthesize会产生错误。

我该如何处理?

1 个答案:

答案 0 :(得分:2)

使用@dynamic意味着将在运行时创建相应的访问者。 NSManagedObject为数据模型中的实体属性执行此操作,但不对您声明的属性执行此操作。您可以使用一些ObjC运行时向导来执行此操作(API都存在,并且受支持,因此它不是可能被称为黑客的),但它并非无足轻重。 (如果@dynamic是实体上的瞬态属性,则使用delegate会很好,但这意味着委托必须是Core Data支持的类型之一,而不是任何实现协议的类)。

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

如果您执行需要自定义设置器,请将@synthesize修改为

@synthesize delegate = _delegate;

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

然后添加一个类似你问题中的一个setter来指定合成名称。