1

我最近开始为 IOS 开发并与调用对象作斗争。

我拥有的是一个从 NSManagedObject 派生的“位置”类(它是 Coredata 模型的一部分)

@interface Location (CoreDataGeneratedAccessors)

- (void)addHasLocationInfoObject:(Info *)value;
...
@end

我还有其他具有类似签名的类(addHasWorkorderInfoObject,...)。

在这种情况下,这些 InfoObject 对其“父对象”有约束,“Location”有几个“LocationInfo”对象,我从数据库中检索并希望添加到 Location 中。同样的事情应该发生在所有分配了 InfoObjects 的对象上。

我现在正在尝试创建一种方法,该方法适用于任何遵守项目文档(位置 - > addHasLocationInfoObject,XY - > addHasXYInfoObject ...)固定的命名约定的对象。

我现在向对象添加信息的方法是:

-(void)setInfoForObject:(NSManagedObject *)managedObject withClass:(NSString *)className 
NSString *noteRefName = [[NSString alloc]init];
noteRefName = [NSString stringWithFormat:@"%@Info", className];
NSString *addInfoSelectorName = [[NSString alloc]init];
addInfoSelectorName = [NSString stringWithFormat:@"addHas%@Object::", infoClassName];

SEL addInfoPropertySelector = NSSelectorFromString(addInfoSelectorName);
NSMethodSignature *signature  = [[managedObject class] methodSignatureForSelector:addNotePropertySelector];
NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature];

[invocation setTarget:managedObject];
[invocation setSelector:addInfoPropertySelector];
[invocation setArgument:&note   atIndex:2];

然而,这给了我一个错误,因为 Signature 对象被设置为 nil。我尝试搜索问题,它似乎与选择器名称中的“:”有关。

但我不明白有多少、在哪里以及为什么我必须设置这些?我似乎也找不到告诉我如何正确执行此操作的文档页面。

任何帮助表示赞赏,在此先感谢!

PS。我记录了 SelectorName 和 Classname,它们都拼写正确。

4

1 回答 1

2

好的,我在您的代码中看到了多个问题。首先,您分配空字符串实例,然后立即用新实例重写它们:

NSString *noteRefName = [[NSString alloc]init];
noteRefName = [NSString stringWithFormat:@"%@Info", className];

这是错误的。正确的做法是:

NSString *noteRefName = [NSString stringWithFormat:@"%@Info", className];

ObjC 中有两种方法:类方法和实例方法。如果您不知道其中的区别,请在此处阅读。因此,第二个问题是您试图获取类方法签名methodSignatureForSelector:而不是获取实例方法签名instanceMethodSignatureForSelector:

所以,据我所知,重写这段代码的正确方法可能是:

NSString *addInfoSelectorName = [NSString stringWithFormat:@"addHas%@Object:", infoClassName];
...
NSMethodSignature *signature = [[managedObject class] instanceMethodSignatureForSelector:addNotePropertySelector];
于 2013-08-08T11:55:51.957 回答