zoukankan      html  css  js  c++  java
  • ObjectiveC中一种消息处理方法performSelector: withObject:

    Objective-C中调用函数的方法是“消息传递”,这个和普通的函数调用的区别是,你可以随时对一个对象传递任何消息,而不需要在编译的时候声明这些方法。所以Objective-C可以在runtime的时候传递人和消息。
     
    首先介绍两个方法 SEL和@selector
    根据AppleObjective-C Runtime Reference官方文档这个传递消息的函数就是 id objc_msgSend(id theReceiver, 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]init];
    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];
    }
    注意:updated at 20120606
    
    1.如果使用了ARC会产生“performSelector may cause a leak because its selector is unknown”警告
    2.这种方式当传入一个不符合约定的消息时会继续运行并不报错。例如应该传入2个参数,但只传入1个参数。或传入了3个参数,第三个参数不会被初始化。
    
    还有一种调用其他Class Function的方法是,但是不能有参数,我们这里假设没有参数,那么就可以这样
    
    [mfs customSelector]; 
    
    完整的代码:
    
    @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

    转:http://www.cnblogs.com/buro79xxd/archive/2012/04/10/2440074.html

  • 相关阅读:
    poj 1088 滑雪
    位运算与bitset
    hdu 4607 Park Visit
    树的直径
    codeforces 495D Sonya and Matrix
    German Collegiate Programming Contest 2015(第三场)
    BAPC 2014 Preliminary(第一场)
    Benelux Algorithm Programming Contest 2014 Final(第二场)
    E. Reachability from the Capital(tarjan+dfs)
    poj2104 K-th Number(划分树)
  • 原文地址:https://www.cnblogs.com/ygm900/p/3115641.html
Copyright © 2011-2022 走看看