Objective -C 类问题
Posted
技术标签:
【中文标题】Objective -C 类问题【英文标题】:Objective -C category issue 【发布时间】:2015-02-26 04:39:14 【问题描述】:我有两个NSManagedObject
子类。
我正在为JSON
表示添加一个类别方法到NSManagedObject
,所以我将这个类别命名为NSManagedObject+JSON
。
在NSManagedObject+JSON.m
中实现分类方法:
- (NSDictionary *)JSONToCreateObjectOnServer
@throw [NSException exceptionWithName:@"JSONStringToCreateObjectOnServer Not Overridden" reason:@"Must override JSONStringToCreateObjectOnServer on NSManagedObject class" userInfo:nil];
return nil;
我正在关注 Ray Weinderleich 的教程:http://www.raywenderlich.com/17927/how-to-synchronize-core-data-with-a-web-service-part-2
它指出:
这里的问题是这个方法没有通用的实现。所有NSManagedObject
子类都必须自己实现此方法,方法是重写它。
只要NSManagedObject
子类没有实现这个方法,就会抛出异常。
我的问题是:
我已将类别中的方法添加到我的子类中。但是我的代码没有调用我的NSManagedObject
子类中的方法,而是进入类别并引发异常。
这里缺少什么? 谁能指出背后的原因?
编辑 1:
- (NSDictionary *)JSONToCreateObjectOnServer
NSDictionary *date = [NSDictionary dictionaryWithObjectsAndKeys:
@"Date", @"__type",
[[SDSyncEngine sharedEngine] dateStringForAPIUsingDate:self.date], @"iso" , nil];
NSDictionary *jsonDictionary = [NSDictionary dictionaryWithObjectsAndKeys:
self.name, @"name",
self.details, @"details",
self.wikipediaLink, @"wikipediaLink",
date, @"date", nil];
return jsonDictionary;
这是我添加到我的 NSManagedObject 类中的方法。
我已经复制并粘贴了。是因为这样,还是我必须按照另一个程序将方法添加到 NSManagedObject 类。
【问题讨论】:
我怀疑在您真正提供行为不端的代码之前,任何人都能够提供帮助。你知道的,比如子类中的实际实现,以及对于初学者来说失败的调用。 还要提供类别的完整代码,因为问题可能在于类别的声明方式。 @MikeTaverne,请在我的问题中查看我的编辑1 @JodyHagins,请在我的问题中查看我的编辑1 这没有多大帮助。这只是一种可以在任何地方使用的方法。请提供足够的代码来传达问题,但不要更多。如果您无法弄清楚所有代码发生了什么,那么其他人在提供面包屑时几乎没有机会。 Objective-C 工作。正确实现的类将导致调用派生类方法。如果这没有发生,那么类的构造可能有问题......或者它们没有被正确调用。 【参考方案1】:创建类别是为了扩展,而不是为了覆盖或修改。所以我们不能保证它是覆盖还是被覆盖。
在你的情况下,你应该创建一个父类,而不是使用类别,它是 NSManagedObject 的子类。然后把下面的方法放到父类中。
- (NSDictionary *)JSONToCreateObjectOnServer
@throw [NSException exceptionWithName:@"JSONStringToCreateObjectOnServer Not Overridden" reason:@"Must override JSONStringToCreateObjectOnServer on NSManagedObject class" userInfo:nil];
return nil;
另一个类将继承你的父类而不是 NSManagedObject。
P/S:你应该使用 NSAssert 而不是 throw。
参考资料:
http://nshipster.com/nsassertionhandler/ https://www.mikeash.com/pyblog/friday-qa-2013-05-03-proper-use-of-asserts.html https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Miscellaneous/Foundation_Functions/【讨论】:
在这里同意。类别是放置抛出异常的必须实现的方法的可怕地方。 @Ares,我同意为扩展创建类别,但是如果您查看 ray weinderlich 的教程,有一种情况是您为 JSON 代表创建类别。数据,并且由于无法实现通用实现,因此在类别的基类中实现了相同的类别方法。 Ray weinderlich 说,如果我们在类别的基类中实现该方法,则该方法是从基类调用的,而不是从类别中调用的。我只是无法理解这一点,我遇到的问题是方法没有在我的类别的基类中调用,而是在类别中调用。 @user3804063:是的,所以我说我们无法确定调用了哪个。你可以找出很多问题,文章说覆盖类别或覆盖类别。不确定 Raywenderlick 是否绝对正确,而且本教程自 2012 年以来太旧了。以上是关于Objective -C 类问题的主要内容,如果未能解决你的问题,请参考以下文章
无法在框架项目的 Objective-C 代码中导入 Swift 类