ios的消息传递—— performSelector
2012-08-16 11:05
369 查看
Objective-C中调用函数的方法是消息传递,这个和普通的函数调用的区别是,你可以随时对一个对象传递任何消息,而不需要在编译的时候声明这些方法。所以Objective-C可以在runtime的时候传递人和消息。首先介绍两个方 ...
Objective-C中调用函数的方法是“消息传递”,这个和普通的函数调用的区别是,你可以随时对一个对象传递任何消息,而不需要在编译的时候声明这些方法。所以Objective-C可以在runtime的时候传递人和消息。 首先介绍两个方法 SEL和@selector 根据AppleObjective-C Runtime Reference官方文档这个传递消息的函数就是 id objc_msgSend(idtheReceiver, SEL theSelector, …) theReceiver是接受消息的对象类型是id,theSelector是消息名称类型是SEL。下边代码我们来看看如何来生成一个SEL,如果传递消息。 首先建立一个简单的函数 - (void) fooNoInputs { NSLog(@"Does nothing"); } 然后调用它 [self performSelector:@selector(fooNoInputs)]; 第二个试验看看如何在消息中传递参数 我们建立一个有input参数的函数 - (void) fooOneIput:(NSString*) first { NSLog(@"Logs %@", first); } 然后调用它 [self performSelector:@selector(fooOneInput:) withObject:@"first"]; 第三个试验更多的参数 - (void) fooFirstInput:(NSString*) first secondInput:(NSString*) second { NSLog(@"Logs %@ then %@", first, second); } 然后调用它 [self performSelector:@selector(fooFirstInput:secondInput:) withObject:@"first"withObject:@"second"]; 第四个试验如何建立动态的函数,然后调用他们?我们需要建立一个selector SEL myTestSelector = @selector(myTest:); 并且我们调用的函数在另外一个Class内 - (void)abcWithAAA: (NSNumber *)number { int primaryKey = [number intValue]; NSLog("%i", primaryKey); } MethodForSelectors * mfs = [MethodForSelectors alloc]; NSArray *Arrays = [NSArray arrayWithObjects:@"AAA", @"BBB", nil]; for ( NSString *array in Arrays ){ SEL customSelector = NSSelectorFromString([NSStringstringWithFormat:@"abcWith%@:", array]); mfs = [[MethodForSelectors alloc] performSelector:customSelector withObject:0]; } 完整的代码: @implementation ClassForSelectors - (void) fooNoInputs { NSLog(@"Does nothing"); } - (void) fooOneIput:(NSString*) first { NSLog(@"Logs %@", first); } - (void) fooFirstInput:(NSString*) first secondInput:(NSString*) second { NSLog(@"Logs %@ then %@", first, second); } - (NSArray *)abcWithAAA: (NSNumber *)number { int primaryKey = [number intValue]; NSLog("%i", primaryKey); } - (void) performMethodsViaSelectors { [self performSelector:@selector(fooNoInputs)]; [self performSelector:@selector(fooOneInput:) withObject:@"first"]; [self performSelector:@selector(fooFirstInput:secondInput:) withObject:@"first"withObject:@"second"]; } - (void) performDynamicMethodsViaSelectors { MethodForSelectors * mfs = [MethodForSelectors alloc]; NSArray *Arrays = [NSArray arrayWithObjects:@"AAA", @"BBB", nil]; for ( NSString *array in Arrays ){ SEL customSelector = NSSelectorFromString([NSStringstringWithFormat:@"abcWith%@:", array]); mfs = [[MethodForSelectors alloc] performSelector:customSelector withObject:0]; } } @end @implementation MethodForSelectors - (void)abcWithAAA: (NSNumber *)number { NSLog("%i", number); } @end |
相关文章推荐
- ios的消息传递—— performSelector
- ios的消息传递—— performSelector
- ios的消息传递—— performSelector
- iOS 消息处理之performSelector
- iOS笔记之--消息处理之performSelector
- iOS 【消息处理 performSelector】
- oc中消息传递机制-附:对performSelector方法的扩充
- oc中消息传递机制-附:对performSelector方法的扩充
- 【转】oc中消息传递机制-附:对performSelector方法的扩充
- iOS 消息处理之performSelector
- oc中消息传递机制-附:对performSelector方法的扩充
- iOS开发——使用delegate进行消息传递
- 消息处理之performSelector
- performSelector和forwardInvocation之消息的派发和转发
- iOS中消息传递方式
- 【iOS】运行时消息传递与转发机制
- IOS如何解决ARC后出现的PerformSelector may cause a leak because its selector is unknown
- iOS中消息的传递机制
- iOS: 通过performSelectorOnMainThread在不同线程中更新界面
- IOS 关于取消延迟执行函数的种种。performSelector与cancelPreviousPerformRequestsWithTarget