IOS NSMethodSignature保持无效

时间:2013-08-08 11:43:47

标签: ios objective-c nsinvocation

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

我所拥有的是一个类“位置”,源自NSManagedObject(它是Coredata模型的一部分)

@interface Location (CoreDataGeneratedAccessors)

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

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

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

我现在正在尝试创建一个适用于任何符合项目文档修复的命名约定的Object的方法(Location - > 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。我尝试搜索问题,它似乎与选择器名称中的“:”有关。

但我不明白有多少,哪里以及为什么要设置这些?我似乎也找不到文档页面,它告诉我如何正确地完成它。

Anny帮助表示感谢,提前致谢!

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

1 个答案:

答案 0 :(得分:2)

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

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

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

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

ObjC中有两种类型的方法:类方法和实例方法。如果您不知道差异,请阅读here。因此,第二个问题是您尝试使用methodSignatureForSelector:获取类方法签名,而不是使用instanceMethodSignatureForSelector:获取实例方法签名。

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

NSString *addInfoSelectorName = [NSString stringWithFormat:@"addHas%@Object:", infoClassName];
...
NSMethodSignature *signature = [[managedObject class] instanceMethodSignatureForSelector:addNotePropertySelector];