关于performSelector

关于performSelectorperformSelec 详解

performSelector详解

在项目中,常常用到performSelectorXXX之类的方法,而且有很多类似方法;今天就来召集一下!


1.performSelectorOnMainThread:withObject:waitUntilDone:

– (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait



在主线程上执行指定的方法,使用默认的模式(NSDefaultRunLoopMode)。

默认的模式指:主线程中的方法进行排队,是一个循环队列,并且循环执行。

参数:

aSelector:要在主线程执行的方法,该方法不能有返回值,并且只能有一个参数。



arg:要传递的参数,如果无参数,就设为nil



wait:要执行的aSelector方法,是否马上执行。

如果设置为YES:等待当前线程执行完以后,主线程才会执行aSelector方法;

设置为NO:不等待当前线程执行完,就在主线程上执行aSelector方法。

如果,当前线程就是主线程,那么aSelector方法会马上执行。



该方法用途:因为iPhone编程,对UI的修改,只能在主线程上执行。可以用该方法来完成UI的修改。





2.performSelector:withObject:afterDelay:

– (void)performSelector:(SEL)aSelector withObject:(id)anArgument afterDelay:(NSTimeInterval)delay



在当前线程中执行指定的方法,使用默认模式,并指定延迟。

参数:

aSelector:指定的方法。含义同上,不在赘述。

anArgument:同上

delay:指定延迟时间(秒)。



3.performSelector



我们常常用到以下3个方法,分别为:



 

– (id)performSelector:(SEL)aSelector;

– (id)performSelector:(SEL)aSelector withObject:(id)object;

– (id)performSelector:(SEL)aSelector withObject:(id)object1 withObject:(id)object2;



首先,定义要调用的方法



 

– (void)methodNoParam{

    NSLog(@”methodNoParam”);

}



– (void)methodWithOneParam:(id)paramFirst{

    NSLog(@”methodWithOneParam: %@”, paramFirst);

    

}



– (void)methodWithParams:(id)paramFirst andParamSecond:(id) paramSecond{

     NSLog(@”methodWithOneParam: %@,%@”, paramFirst,paramSecond);

           

}



其次,进行调用


// 没有参数

    BOOL isNoParam= [self.selfViewControllerDelegate respondsToSelector:@selector(methodNoParam)];

    if (isNoParam) {

        [self.selfViewControllerDelegate performSelector:@selector(methodNoParam)];

    }

    

    // 一个参数

    BOOL isOneParam= [self.selfViewControllerDelegate respondsToSelector:@selector(methodWithOneParam:)];

    if (isOneParam) {

        [self.selfViewControllerDelegate performSelector:@selector(methodWithOneParam:) withObject:@”firsht”];

    }

    

    // 二个参数

    BOOL isParams= [self.selfViewControllerDelegate respondsToSelector:@selector(methodWithParams: andParamSecond:)];

    if (isParams) {

        [self.selfViewControllerDelegate performSelector:@selector(methodWithParams: andParamSecond:)withObject:@”first” withObject:@”second”];

    }



下面两段代码都在主线程中运行,我们在看别人代码时会发现有时会直接调用,有时会利用performSelector调用,今天看到有人在问这个问题,我便做一下总结,

[delegate imageDownloader:self didFinishWithImage:image];

[delegate performSelector:@selector(imageDownloader:didFinishWithImage:) withObject:selfwithObject:image];

1、performSelector是运行时系统负责去找方法的,在编译时候不做任何校验;如果直接调用编译是会自动校验。如果imageDownloader:didFinishWithImage:image:不存在,那么直接调用 在编译时候就能够发现(借助Xcode可以写完就发现),但是使用performSelector的话一定是在运行时候才能发现(此时程序崩溃);Cocoa支持在运行时向某个类添加方法,即方法编译时不存在,但是运行时候存在,这时候必然需要使用performSelector去调用。所以有时候如果使用了performSelector,为了程序的健壮性,会使用检查方法

– (BOOL)respondsToSelector:(SEL)aSelector;

2、直接调用方法时候,一定要在头文件中声明该方法的使用,也要将头文件import进来。而使用performSelector时候, 可以不用import头文件包含方法的对象,直接performSelector调用即可。


版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/215402.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月18日 下午2:00
下一篇 2026年3月18日 下午2:00


相关推荐

  • snmp trap 接收_amtrak

    snmp trap 接收_amtrak在进行winsnmp及其它api进行snmp开发时,基本上都会有一个接收trap的功能

    2022年8月20日
    7
  • pycharm中文插件下载_去插件安装是什么意思

    pycharm中文插件下载_去插件安装是什么意思我使用的PyCharm软件的版本:2016.1.4参考网站:https://www.jetbrains.com/help/pycharm/2016.1/installing-updating-and-uninstalling-repository-plugins.html给PyCharm软件添加plugins的图文操作(这里以添加Markdown插件)Step1.启动PyC

    2022年8月25日
    11
  • 【linux】查看Linux系统版本信息的几种方法[通俗易懂]

    【linux】查看Linux系统版本信息的几种方法[通俗易懂]一、查看Linux内核版本命令(两种方法):1、cat/proc/version2、uname-a二、查看Linux系统版本的命令(3种方法):1、lsb_release-a,即可列出所有版本信息:这个命令适用于所有的Linux发行版,包括RedHat、SUSE、Debian…等发行版。2、cat/etc/redhat-release,这种方法只适合Redhat系的Linux:[root@S-CentOShome]#cat/etc/redhat-rele

    2025年11月30日
    7
  • selenium模块谷歌驱动配置教程

    selenium模块谷歌驱动配置教程第一步 找到谷歌浏览器的版本 复制蓝色区域版本号第二步 前往谷歌驱动的下载网址 下载驱动压缩包 http npm taobao org mirrors chromedriver 进入网页 ctrl f 打开搜索栏 粘贴刚刚复制的版本号 选择最高版本 或者版本最接近的 点击选中的版本进入详情页 选择 win32 的压缩包 windows64 位也是这个压缩包 点击一下下载至本地 第三步 将下载好的 zip 文件解压至文件当前解释器 python exe 所在目录即可

    2026年3月19日
    2
  • Windows 下 Python 虚拟环境 使用workon 统一管理

    Windows 下 Python 虚拟环境 使用workon 统一管理首先强调一下 windows10 系统下的 powershell 使用虚拟环境有点坑 创建以后激活不了 使用 workon 又进不去 注意 virtualenvwr 在 Windows 系统中只能通过 cmd 才能正常使用下面按连接的做基本没问题 https www jianshu com p 3b9b218b66a3

    2026年3月17日
    1
  • 简练网软考知识点整理-项目需求跟踪及需求跟踪矩阵[通俗易懂]

    简练网软考知识点整理-项目需求跟踪及需求跟踪矩阵[通俗易懂]需求跟踪矩阵是把产品需求从其来源连接到能满足需求的可交付成果的一种表格。使用需求跟踪矩阵,可以把每个需求与业务目标或项目目标联系起来,有助于确保每个需求都具有商业价值。需求跟踪矩阵提供了在整个项目生命周期中跟踪需求的一种方法,有助于确保需求文件中被批准的每项需求在项目结束的时候都能交付。最后,需求跟踪矩阵还为管理产品范围变更提供了框架。

    2025年5月24日
    8

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号