- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我最近开始为 IOS 开发并与调用对象作斗争。
我有一个类“Location”,派生自 NSManagedObject(它是 Coredata 模型的一部分)
@interface Location (CoreDataGeneratedAccessors)
- (void)addHasLocationInfoObject:(Info *)value;
...
@end
我还有其他具有类似签名的类(addHasWorkorderInfoObject,...)。
这些 InfoObjects 对其“父对象”有约束,在这种情况下,“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:¬e atIndex:2];
但是这给了我一个错误,因为 Signature 对象被设置为 nil。我尝试搜索问题,它似乎与选择器名称中的“:”有关。
但我不明白有多少、在哪里以及为什么我必须设置这些?我似乎也找不到告诉我如何正确执行此操作的文档页面。
感谢 Anny 的帮助,提前致谢!
附言。我记录了 SelectorName 和 Classname,它们都拼写正确。
最佳答案
好的,我发现您的代码中存在多个问题。首先,您分配空字符串实例,然后立即用新实例重写它们:
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];
关于IOS NSMethodSignature 保持为零,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18125143/
我最近开始为 IOS 开发并与调用对象作斗争。 我有一个类“Location”,派生自 NSManagedObject(它是 Coredata 模型的一部分) @interface Location
在 ObjC 中我有: NSMethodSignature *ms = [[object.target class] instanceMethodSignatureForSelector:object
我正在使用此方法将方法分派(dispatch)给委托(delegate),不幸的是,我发现大多数时候 NSMethodSignature 为 nil,这是因为选择器来自协议(protocol)。我想知
我需要一种方法来在运行时检查给定 block 的参数数量和参数类型(我目前正在编写的某些对象映射库需要这个,我正在将字符串格式的值映射到选择器,想要相同的 block )。 我尝试了以下示例中的代码,
我在使用 [NSMethodSignature getArgumentTypeAtIndex] 函数时遇到了非常奇怪的行为。它返回 BOOL 类型的“@”字符,根据 objective-c type
我正在尝试在协议(protocol)方法中获取 block 的签名。 这是一个示例协议(protocol): @protocol ProtocolSample - (void) doSomethin
我如何在 swift 2 中编写这个类? NSMethodSignature 和 NSInvocation 在 swift 2 中不再存在 @implementation MyAuth - (void
在苹果的 documentation这个方法的最后说了以下内容: 特殊注意事项 此方法自 Mac OS X v10.0 起可用,在 Mac OS X v10.5 中公开。仅支持应用程序运行所针对的运行
我在手机上运行以下代码,其中“对象”是猫,它是动物的子类。动物有一个属性“颜色”: NSLog(@"Object: %@", object); NSLog(@"Color: %@", [object
我是一名优秀的程序员,十分优秀!