Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/100.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 在Xcode 4.4及更高版本中,在NSManagedObjects的类别中重载方法名称会发出警告_Objective C_Ios_Xcode_Core Data_Categories - Fatal编程技术网

Objective c 在Xcode 4.4及更高版本中,在NSManagedObjects的类别中重载方法名称会发出警告

Objective c 在Xcode 4.4及更高版本中,在NSManagedObjects的类别中重载方法名称会发出警告,objective-c,ios,xcode,core-data,categories,Objective C,Ios,Xcode,Core Data,Categories,我的NSManagedObject子类都有一个类别,其中包含工厂方法,以便在自动重新生成类文件时不会丢失它们。因此,我不需要知道运行时使用的是NSManagedObject的哪个子类,每个子类的工厂方法都有相同的名称,例如 + (id)objectWithInfo:(NSDictionary *)info inManagedObjectContext:(NSManagedObjectContext *)context; (为了清楚起见,在本例中,假设有一个从NSManagedObject派生的

我的
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):元方法“objectWithInfo:inManagedObjectContext:”位于 来自…项+工厂的类别。o与来自的相同方法冲突 另一类

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


我做的不好吗?或者有没有其他方法来声明我删除警告的方法?

回答我自己的问题:

我在每个子类的头中重新声明了这个方法。在超类中声明一次就对它进行了排序

此外,将所有+Factory.h#导入移动到预编译头中(并在其他地方删除)可以大大减少混乱和附加警告


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

您可能可以将该方法推广到所有对象的工作方式相同

+ (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;
}

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

由于您正在向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

另外,在不加前缀(作为命名空间)的情况下,将category方法添加到您不拥有的类中也是一种糟糕的形式因为原始供应商或库供应商可能会添加此方法并导致冲突。它会根据字典中的信息生成一个新对象并返回它。因此,对于我拥有的NSManagedObject的每个子类,此方法的每个实现都是不同的。您的意思是将此方法作为cat添加到NSMO,然后在每个子类中实现吗cat?Re:前缀,是的,我是前缀,但出于隐私考虑删除了。废话,有没有任何类型的查找或创建逻辑,或者这是一种直接的创建方便的方法?谢谢。实际上,我已经这样做了,我只是跳过了我的解释。我有我的ManagedObject,它有一个工厂类别,在那里我首先声明了这些常用方法。Th每个子类都是这样的,并且有自己的工厂类别。我认为你的解决方案意味着把方法放在主类中,而不是一个类别中?但是我回到自动生成的文件的问题上…你在生成的文件中遇到了什么问题?如果只是方法没有出现在这些文件中,你只是需要将其添加到.m文件中,它将替换超类的实现。您可以开始键入“+(id)objectWith…”,并且autocomplete应该从超类头中识别它。(只需确保.h文件已导入。)我的问题是,我希望能够在不做任何更改的情况下重新自动生成,这就是使用类别的原因。