IOS NSMethodSignature保持为零

IOS NSMethodSignature保持为零,ios,objective-c,nsinvocation,Ios,Objective C,Nsinvocation,我最近开始为IOS开发,并努力处理调用对象 我拥有的是一个类“Location”,它派生自NSManagedObject(它是Coredata模型的一部分) 我还有其他具有类似签名的类(AddHasWorkOrderInFooObject,…) 这些InfoObject对其“父对象”有约束,在本例中,“Location”有几个“LocationInfo”对象,我从数据库中检索这些对象,并希望将其添加到位置。同样的事情也应该发生在所有分配了InfoObjects的对象上 我现在正在尝试创建一个方法

我最近开始为IOS开发,并努力处理调用对象

我拥有的是一个类“Location”,它派生自NSManagedObject(它是Coredata模型的一部分)

我还有其他具有类似签名的类(AddHasWorkOrderInFooObject,…)

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

我现在正在尝试创建一个方法,该方法将适用于坚持项目文档固定的命名约定的任何对象(Location->addHasLocationInfoObject,XY->addhassyinfoobject…)

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

-(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];
但是,这给了我一个错误,因为签名对象被设置为nil。我尝试搜索问题,它似乎与选择器名称中的“:”有关

但我不明白有多少,在哪里,为什么我要设置这些?我似乎也没有找到告诉我如何正确操作的文档页面

感谢您的帮助,提前感谢


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

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

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];

我不明白为什么在方法名中放两个“:”,而在方法签名中只有一个“:”?因为没有“:”和“一:”都不起作用,所以我给了它一个快照^^NSLog生成的选择器名。(“addHas(null)Object:”不是有效的选择器名称,例如。)为什么不使用
-performSelector:withObject:
使用
NSSelectorFromString
?您还应该将
methodSignatureForSelector:
发送到
managedObject
而不是其
类。我更正了实例化的空对象,但是你的修正导致了同样的错误,我想managedObject是错的。我刚刚创建了一个测试项目,它对我来说运行良好。NSLog([NSString stringWithFormat:@“%@-%@,[managedObject class],addNoteSelectorName]);日志正确值“Location-addHasLocationInfoObject”添加以下日志:NSLog(@“%d”,[managedObject respondsToSelector:addInfoPropertySelector]);响应选择器日志:“1”
NSString *addInfoSelectorName = [NSString stringWithFormat:@"addHas%@Object:", infoClassName];
...
NSMethodSignature *signature = [[managedObject class] instanceMethodSignatureForSelector:addNotePropertySelector];