关于performSelector调用和直接调用区别

下面两段代码都在主线程中运行,我们在看别人代码时会发现有时会直接调用,有时会利用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调用即可。

时间: 2024-10-10 08:51:14

关于performSelector调用和直接调用区别的相关文章

performSelector 与 self直接调用,

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

函数库调用和系统调用的区别

函数库调用和系统调用的区别. 操作系统层面上:系统调用是调用操作系统内核的一部分.系统调用,每个操作系统会存在不同. 速度上:系统调用一次需要35微秒.函数库一次调用耗费半微秒. 系统调用大概有70个. 文件描述符和文件指针的区别 将会进行干嘛呢. 文件描述符是一个整型数字.操作系统的系统调用,都需要传递这个值进去. 作者建议,要使用标准的i/o库调用.这样会出现移植性. 文件指针则是一个内存地址,指向了一个数据结构.结构里面保持哪些内容?描述符,可以有很多种描述办法. 用途不同,文件描述符是进

oracle创建函数和调用存储过程和调用函数的例子(区别)

创建函数: 格式:create or replace function func(参数 参数类型) Return number Is Begin --------业务逻辑--------- End; --创建函数 create or replace function func (dno number) return number is t_max number; begin select max(sal) into t_max from emp t where deptno = dno; ret

微服务间的调用和应用内调用的有啥区别

摘要 目前大部分的系统架构都是微服务架构,就算没有注册中心.服务管理,也肯定是多个服务,单体服务比较少了. 大家平时需要在应用内调用rpc接口也比较多,那么有没有思考过微服务之间的调用和应用内直接调用有什么区别呢?面试时是不是经常被被问到微服务呢,本篇文章针对微服务间的方法调用和应用内方法调用的有啥区别这个很小的点,谈谈我的经验 微服务调用特点 先从单体应用说起 单体应用 单体引用通过一个服务节点直接组装好数据,返回给调用者.所有的方法调用都发生在应用内部. 微服务应用 商品详情服务需要调用商品

解析库函数调用与系统调用的区别

基于上一篇文章,系统调用的实现原理,计算机系统的各种硬件资源是有限的,而在现代多任务操作系统上的多个进程都需要这些资源,为了更好的管理这些资源,进程是不允许直接访问的,而是在操作系统的控制下访问,因此操作系统是使用这些资源的唯一入口,而这个入口就是操作系统的系统调用,系统调用属于系统内核的一部分,因此运行在内核态的进程可以直接访问这些资源,而用户态的进程如果想要访问需要先通过中断切换为内核态才可以访问. Linux中处理系统调用的方式与中断类似.每个系统调用都有相应的系统调用号作为唯一的标识,内

反射-优化及程序集等(用委托的方式调用需要反射调用的方法(或者属性、字段),而不去使用Invoke方法)

创建Delegate (1).Delegate.CreateDelegate(Type, MethodInfo) : 创建指定类型的静态方法, 1.Type(委托类型) 2.MethodInfo(要创建的静态方法的信息,通过类的type.GetMethod( funcName , BindingFlags.IgnoreCase | BindingFlags.Static | BindingFlags.Public )获取) 3.例:typeof(string).GetMethod(“Equals

C#(同步调用、异步调用、异步回调)

本文将主要通过“同步调用”.“异步调用”.“异步回调”三个示例来讲解在用委托执行同一个“加法类”的时候的的区别和利弊. 首先,通过代码定义一个委托和下面三个示例将要调用的方法: public delegate int AddHandler(int a,int b);    public class 加法类    {        public static int Add(int a, int b)        {            Console.WriteLine("开始计算:&quo

C#:同步调用、异步调用、异步回调

ylbtech-C#:同步调用.异步调用.异步回调 1.返回顶部 1. 本文将主要通过“同步调用”.“异步调用”.“异步回调”三个示例来讲解在用委托执行同一个“加法类”的时候的的区别和利弊. 首先,通过代码定义一个委托和下面三个示例将要调用的方法: public delegate int AddHandler(int a,int b);    public class 加法类    {        public static int Add(int a, int b)        {    

RHEL6-X Window System-8.图形桌面的本地调用与远程调用解析

Linux的X或X11 (X Window System)是一个基础的图形框架接口,拥有基本的图形显示.在此框架基础之上,有诸如GNOME/KDE之类的图形桌面窗口管理应用软件(Window manager).而且图形框架X11包括两大部分X Client与X Server,采用C/S主从架构.所以它是一个system而不单单只是一个组件. Linux图形桌面的本地调用与远程调用解析如图 说明: 通过图形还是文本控制台传递命令,经过内核处理后,返回相应的数据给对方 本地情况: 1.如果是图形,则

同步调用和异步调用同时存在导致的混乱

其实在Promise之外也存在这个问题,这里我们以一般的使用情况来考虑此问题.这个问题的本质是接收回调函数的函数,会根据具体的执行情况,可以选择是以同步还是异步的方式对回调函数进行调用.下面我们以 onReady(fn) 为例进行说明,这个函数会接收一个回调函数进行处理. mixed-onready.js function onReady(fn) { var readyState = document.readyState; if (readyState == 'interactive' ||