2

我正在使用 Objective-C 中的动态编程进行一些工作,并且我已经从头到尾阅读了 Objective-C 运行时编程指南,并且能够完成我需要的大部分工作,但有一件事我还没有弄清楚是如何动态调用方法,只要我有它的字符串表示。

本质上,我动态地进行属性查找以查看我的对象是否具有使用 class_copyPropertyList 从列表中匹配的属性,然后通过从 plist 文件填充的 NSMutableDictionary 循环并匹配这些属性。当找到匹配项时,我想执行该属性。我无法提前知道可能存在哪些匹配项,因为这是一个将被打包到许多不同应用程序中的库。

4

2 回答 2

7

用于从. NSSelectorFromString_ 然后您可以使用其中一种方法执行它。SELNSStringperformSelector

动态设置属性:

SEL setter = NSSelectorFromString(@"setProperty:");
[myObject performSelector:setter withObject:newValue];

动态获取属性:

SEL getter = NSSelectorFromString(@"property");
id myProperty = [myObject performSelector:getter];

对于更复杂的方法,您可以使用NSInvocationand NSMethodSignature

SEL action = NSSelectorFromString(@"someMethod:withArguments:");
NSMethodSignature *signature = [myObject methodSignatureForSelector:action];
NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature];
[invocation setArgument:arg1 atIndex:2]; // indices 0 and 1 are reserved.
[invocation setArgument:arg2 atIndex:3];
[invocation invokeWithTarget:myObject];
id returnedObject;
[invocation1 getReturnValue:&returnedObject];
于 2012-11-18T15:35:08.580 回答
2
SEL s = NSSelectorFromString(selectorName);
[anObject performSelector:s];

苹果文档:https ://developer.apple.com/library/ios/#documentation/Cocoa/Reference/Foundation/Miscellaneous/Foundation_Functions/Reference/reference.html#//apple_ref/c/func/NSSelectorFromString

于 2012-11-18T15:33:45.947 回答