关于performSelector

偶尔机会接触到了它。由网上的知识总结了一个小代码。希望,对大家有用。

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view.

    self.title=@"performSelector";

    //performSelector是运行时系统负责去找函数/方法的,在编译时候不做任何校验;但是直接调用肯定在编译是会校验。如果函数不存在,那么直接调用 在编译时候就能够发现(借助Xcode可以写完就发现),但是使用performSelector的话一定是在运行时候才能发现(此时程序崩溃)
    //Cocoa支持在运行时 向某个类添加方法(应该极少人用到, 即方法编译时不存在,但是运行时候存在,这时候必然需要使用performSelector去调用)

    /*直接调用方法时候,一定要在头文件中声明该方法,使用时候,也要将头文件import进来

    而使用performSelector时候, 可以不用import头文件,对包含方法的 对象 调用performSelector即可*/

    // 没有参数
    BOOL isNoParam= [self respondsToSelector:@selector(methodNoParam)];
    if (isNoParam) {
        [self performSelector:@selector(methodNoParam)];
    }

    // 一个参数
    BOOL isOneParam= [self respondsToSelector:@selector(methodWithOneParam:)];
    if (isOneParam) {
        [self  performSelector:@selector(methodWithOneParam:) withObject:@"firsht"];
    }

    // 二个参数
    BOOL isParams= [self  respondsToSelector:@selector(methodWithParams: andParamSecond:)];
    if (isParams) {
        [self  performSelector:@selector(methodWithParams: andParamSecond:) withObject:@"first" withObject:@"second"];
    }

}
#pragma -mark -perform
- (void)methodNoParam{
    NSLog(@"methodNoParam");
}

- (void)methodWithOneParam:(id)paramFirst{
    NSLog(@"methodWithOneParam: %@", paramFirst);

}

- (void)methodWithParams:(id)paramFirst andParamSecond:(id) paramSecond{
    NSLog(@"methodWithOneParam: %@,%@", paramFirst,paramSecond);

}

打印出的结果:

2014-08-11 20:59:43.895 performSelector[11302:60b] methodNoParam

2014-08-11 20:59:43.895 performSelector[11302:60b] methodWithOneParam: firsht

2014-08-11 20:59:43.896 performSelector[11302:60b] methodWithOneParam: first,second

 

关于performSelector,布布扣,bubuko.com

时间: 2024-12-21 14:30:56

关于performSelector的相关文章

初探swift语言的学习笔记十一(performSelector)

作者:fengsh998 原文地址:http://blog.csdn.net/fengsh998/article/details/35842441 转载请注明出处 如果觉得文章对你有所帮助,请通过留言或关注微信公众帐号fengsh998来支持我,谢谢! 在OC中使用好好的performSelector,但不知为什么在swift有意的被拿掉了.更有甚者连IMP, objc_msgSend也不能用了.虽然想不通为什么,但应该有他的道理.就不纠结了. 大家可能在OC中使用得更多的就是延时处理,及后台处

PerformSelector

1. 执行和取消 //执行 [self performSelector:@selector(showMessage) withObject:nil afterDelay:0]; //取消 [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(showMessage) object:nil]; (1)PerformSelector与直接调用的区别 performSelector是运行时系统负责去找方法的,

iOS 网络与多线程--7.Performselector消息处理方法

创建一个IOSApp类 IOSApp.h文件 1 #import <Foundation/Foundation.h> 2 3 @interface IOSApp : NSObject 4 5 // 1.添加一个无参数的方法 6 -(void)printInfomation; 7 8 // 2.添加一个有参数的方法 9 -(void)buyApp:(id)appName; 10 11 @end IOSApp.m文件 1 #import "IOSApp.h" 2 3 @impl

iOS多线程中performSelector: 和dispatch_time的不同

iOS中timer相关的延时调用,常见的有NSObject中的performSelector:withObject:afterDelay:这个方法在调用的时候会设置当前runloop中timer,还有一种延时,直接使用NSTimer来配置任务. 这两种方式都一个共同的前提,就是当前线程里面需要有一个运行的runloop并且这个runloop里面有一个timer. 我们知道:只有主线程会在创建的时候默认自动运行一个runloop,并且有timer,普通的子线程是没有这些的.这样就带来一个问题了,有

IOS 关于取消延迟执行函数的种种。performSelector与cancelPreviousPerformRequestsWithTarget

本文非本人撰写 [cpp] view plaincopy @interface NSObject (NSDelayedPerforming) - (void)performSelector:(SEL)aSelector withObject:(id)anArgument afterDelay:(NSTimeInterval)delay inModes:(NSArray *)modes; - (void)performSelector:(SEL)aSelector withObject:(id)a

Objective-C中一种消息处理方法performSelector

Objective-C中调用函数的方法是“消息传递”,这个和普通的函数调用的区别是,你可以随时对一个对象传递任何消息,而不需要在编译的时候声明这些方法.所以Objective-C可以在runtime的时候传递人和消息. 首先介绍两个方法 SEL和@selector 根据AppleObjective-C Runtime Reference官方文档这个传递消息的函数就是 id objc_msgSend(id theReceiver, SEL theSelector, …) theReceiver是接

oc消息发送机制之performSelector方法的扩充

本文摘自别的博客 各种语言都有些传递函数的方法:C语言中可以使用函数指针,C++中有函数引用.仿函数和lambda,Objective-C里也有选择器(selector)和block. 不过由于iOS SDK中的大部分API都是selector的方式,所以本文就重点讲述selector了.Objective-C和我接触过的其他面向对象的语言不同,它强调消息传递,而非方法调用.因此你可以对一个对象传递任何消息,而不需要在编译期声名这些消息的处理方法. 很显然,既然编译期并不能确定方法的地址,那么运

Swift里performSelector方法的替代

最近在回答StackOverflow的问题时,发现performSelector方法在Swift被去掉,Apple的注释是这个方法被去掉是因为不安全: NOTE The performSelector: method and related selector-invoking methods are not imported in Swift because they are inherently unsafe. 如果在Swift调用这个方法会编译出错: 'performSelector' is

performSelector 与 self直接调用,

1,程序的健壮性 2,编译时候校验执行时候校验 respondsToSelector,判断某个类 是否实现了该方法 - (IBAction)linkClickAction:(id)sender { [NSObject cancelPreviousPerformRequestsWithTarget:sender]; URLLinkView* view = (URLLinkView*)sender; if ([self.mDelegate respondsToSelector:@selector(c