0

我的每个NSManagedObject子类都有一个类别,工厂方法位于其中,因此在自动重新生成类文件时它们不会丢失。这样我就不需要知道NSManagedObject我在运行时使用的是哪个子类,每个子类的工厂方法都具有相同的名称,例如

+ (id)objectWithInfo:(NSDictionary *)info inManagedObjectContext:(NSManagedObjectContext *)context;

(为了清楚起见,在此示例中,假设有一个派生自NSManagedObject被调用的实体Item,具有生成的文件 Item.m 和 Item.h,以及我自己的具有文件 Item+Factory.m 和 Item+Factory.h 的类别,上面的方法所在的位置)。

在 Xcode 4.3 中,这不会产生警告:但 Xcode 4.4(及更高版本将其标记为警告:

(null): ...Item+Factory.o 类别中的元方法“objectWithInfo:inManagedObjectContext:”与另一个类别中的相同方法冲突

现在,我很清楚在类别中重载方法的危险,这是一件坏事。然而,我在这里所做的只是将对象视为比它们更一般的类,据我所知,这是明智的。

难道我做的不好?还是有不同的方法来声明我的方法来删除警告?

4

3 回答 3

0

回答我自己的问题:

我在每个子类的标题中重新声明了该方法。在超类中声明一次对其进行了排序。

此外,将所有 +Factory.h #imports 移动到预编译的头文件中(并在其他地方删除)大大减少了混乱和额外的警告。

感谢 Paul.s 让我沿着这些思路思考。

于 2012-07-26T16:53:58.493 回答
0

您可能可以将该方法概括为对所有对象以相同的方式工作

+ (id)ps_insertNewObjectForEntityForName:(NSString *)entityName inManagedObjectContext:(NSManagedObjectContext *)context objectInfo:(NSDictionary *)objectInfo;
{
    NSManagedObject *managedObject = [self insertNewObjectForEntityForName:entityName inManagedObjectContext:context];

    [objectInfo enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
        [managedObject setValue:obj forKey:key];
    }];

    return managedObject;
}
于 2012-07-26T16:56:42.073 回答
0

看起来您是自己发现的,但为了向未来的读者澄清:

由于您要向 NSManagedObject 添加所有子类都需要重载的功能,因此最好的方法可能是创建 NSManagedObject 的通用子类,然后它可以作为 Item 之类的超类。(子类化旨在以这种方式工作,但类别不是。)例如:

// ABCManagedObject.h
@interface ABCManagedObject : NSManagedObject
+ (id)objectWithInfo:(NSDictionary *)info inManagedObjectContext:(NSManagedObjectContext *)context;
@end

// ABCManagedObject.m
@implementation ABCManagedObject
+ (id)objectWithInfo:(NSDictionary *)info inManagedObjectContext:(NSManagedObjectContext *)context
{
    // no-op; use subclasses instead.
}
@end

// Item.h
@interface Item : ABCManagedObject
@end

// Item.m
@implementation Item
+ (id)objectWithInfo:(NSDictionary *)info inManagedObjectContext:(NSManagedObjectContext *)context
{
    // create and initialize new object and return it
}
@end
于 2012-07-26T17:00:04.397 回答