`
浮生长恨
  • 浏览: 208276 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Objective-C中一种消息处理方法performSelector: withObject:(转)

阅读更多

原地址:http://www.cnblogs.com/buro79xxd/archive/2012/04/10/2440074.html

 

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 allocperformSelector: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 allocperformSelector:customSelector withObject:0];

}

}

@end

 
@implementation MethodForSelectors

- (void)abcWithAAA: (NSNumber *)number {

NSLog("%i", number);

}

@end

 
 
--EOF--

作者:Buro#79xxd 出处:http://www.cnblogs.com/buro79xxd/ 文章版权归本人所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
分享到:
评论

相关推荐

    InvocationDemo

    NSInvocation的作用和performSelector:withObject:的作用是一样的:用于iOS编程中调用某个对象的消息。 performSelector:withObject:调用一些参数较少的消息是比较方便的,但是对于参数个数大于2的消息,使用...

    objective-c小技巧

    [self performSelector:@selector(machineBallAction) withObject:nil afterDelay:0]; 3.实现随机数:srandom(time(NULL)); 4. #pragma mark - #pragma mark Initialization 它们告诉Xcode编译器,要在...

    iOS中NSInvocation的基本用法教程

    大家应该都有所了解,在 iOS中可以直接调用某个对象的消息方式有两种:一种是performSelector:withObject;再一种就是NSInvocation。 第一种方式比较简单,能完成简单的调用。但是对于>2个的参数或者有返回值的处理...

    ftp客户端 ios的库

    [(NSObject*)self performSelector:@selector(request:didUpdateStatus:) withObject:self withObject:status]; 应该是 [(NSObject*)self.delegate performSelector:@selector(request:didUpdateStatus:) with...

    EasyTimeline, 时间轴需要的简单时间线类.zip

    EasyTimeline, 时间轴需要的简单时间线类 EasyTimeline有时你需要在特定的时间和...当它只是一个事件 2.0秒后, performSelector:withObject:afterDelay: 完美。如果需要一些更复杂的事情,那么需要在 3.0秒内进行一

    leetcode题库-iOS-Interview-Questions:收集整理iOS笔试面试题

    performSelector:withObject:方法的作用是什么? 解释一下多态 如何实现深拷贝 http和socket通信的区别,tcp和udp的区别,session和cookie的区别 block实现原理 响应链 frame 和 bounds 写一个宏MIN,这个宏输入两个...

    iOS中延时执行的几种方式比较及汇总

    前言 在开发过程中,我们有时会希望把一些操作封装起来延迟一段时间后再执行。... [self performSelector:@selector(delayDo:) withObject:nil afterDelay:1.0f];  //带参数 [self performSelector:@selector(delayD

    蓝牙自动开启

    [self performSelector:@selector(toggle:) withObject:btCont afterDelay:1.0f] ; #endif } #if TARGET_IPHONE_SIMULATOR #else - (void)toggle:(id)btCont { BOOL currentState = [btCont enabled] ; [btCont ...

    iOS长按按钮

    [self performSelector:@selector(lazyButtontouchDown) withObject:nil afterDelay:self.minimumPressDuration]; } -(void)lazyButtontouchDown { } //当离开按钮的时候取消所调用的方法 - (void)...

    对比分析iOS延迟执行的4种方式

    代码如下:[self performSelector:@selector(delayMethod) withObject:nil afterDelay:1.0f]; 1.特点: 此方式要求必须在主线程中执行,否则无效。 是一种非阻塞的执行方式, 暂时未找到取消执行的方法。 二、定时器:...

    ios-超简单一个方法实现播放动画.zip

    - (void)playAnimateWithName:(NSString *)name framesNumber:(int)frames {... [self.imageView performSelector:@selector(setAnimationImages:) withObject:nil afterDelay:self.imageView.animationDuration]; }

    EasyTimeline(iPhone源代码)

    一般来说,如果需要几秒钟之后触发某个函数,可以使用performSelector:withObject:afterDelay: 。如果需要每几秒钟执行一次某个函数,可以使用NSTimer。但是,如果需要同时进行两者,比如每2秒钟执行一个动作,然后...

    iOS中UIAlertView3秒后消失的两种实现方法

    主要介绍了iOS中UIAlertView3秒后消失的两种实现方法,实现方法涉及到NSTimer和PerformSelector:withObject:afterDelay:方法的结合使用,需要的朋友可以参考下

    objective c 消息 objc_msgSend

    objective c 消息 objc_msgSend 及 performSelector 的使用例子。

    IOS多线程编程NSThread的使用方法

    IOS多线程编程NSThread的使用...(1)多用于串行:- (id)performSelector:(SEL)aSelector withObject:(id)object; (2)后台执行,多用于并行:- (void)performSelectorInBackground:(SEL)aSelector withObject:(nul

    IOS开发中延迟执行和取消

    在 Objective-C 中延迟执行还是很常见的需求,通常有如下几种方式可供选择: performSelector: 想要延迟调用某个方法: [self performSelector:@selector(delay) withObject:nil afterDelay:3.0]; 取消延迟的方法...

    OC-performSelector

    OC-performSelector

    ios demo,performSelector和respondsToSelector

    ios demo,performSelector和respondsToSelector,动态添加方法,多参数调用

    swift performSelector

    swift并没有提供performSelector ,我伪代码写了一个扩展类。使用时请小心。详见我博文说明。http://blog.csdn.net/fengsh998/article/details/35842441

    浅析iOS应用开发中线程间的通信与线程安全问题

    线程间的通信   简单说明 线程间通信:在1个进程中,线程往往不是孤立存在的,多个线程之间需要经常进行通信 ...– (void)performSelector:(SEL)aSelector onThread:(NSThread *)thr withObject:

Global site tag (gtag.js) - Google Analytics