一、performSelector调用和直接调用区别

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

[delegate imageDownloader:self didFinishWithImage:image];

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

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

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

.person.m文件的实现内容

- (void)invoke {

    //1.使用perform调用不带参数的方法
    //SEL是一个类型:方法选择器  @selector(方法名)     [self performSelector:@selector(demo1)];
    
    //2.使用perform调用带有一个参数的方法     [self performSelector:@selector(demo2:) withObject:@"这是一个参数"];
    
    //3.使用perform调用带有两个个参数的方法     [self performSelector:@selector(demo3:withName:) withObject:@"参数1" withObject:@"参数2"];
  
    
    //4.延迟调用某一个方法
    //代码不会停留在这里,这个任务会挂载后台,后面代码继续执行     [self performSelector:@selector(demo1) withObject:NULL afterDelay:2.5];
    
} //不带参数
- (void)demo1 {     NSLog(@"这是demo1");
} //带有一个参数的方法
- (void)demo2:(NSString *)str {
    NSLog(@"这是demo2 str:%@",str);
} //带有两个参数的方法
- (void)demo3:(NSString *)str withName:(NSString *)name {     NSLog(@"这是demo3,str:%@  name:%@",str,name);
} //私有方法
- (void)testMethod {     NSLog(@"这是一个私有方法");
}

三.perform调用的演示

     Person *p = [[Person alloc]init];

    [p invoke];

//  [p testMethod];会报错
    //使用perform调用私有方法
  [p performSelector:@selector(testMethod)];
    
    //判断某一个对象是否响应了某一个方法
    BOOL isRespond = [p respondsToSelector:@selector(testMethod)];
    if (isRespond) {
        [p performSelector:@selector(testMethod)];
    }else {
        NSLog(@"p没有实现这个方法");
    }

performSelector和respondsToSelector用法的更多相关文章

  1. oc基础知识

    只在@interface中定义变量的话,你所定义的变量只能在当前的类中访问,在其他类中是访问不了的:而用@property声明的变量可以在外部访问. 用了@property去声明的变量,可以使用“se ...

  2. performSelector的原理以及用法

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

  3. Objective-C中的runtime的原理和用法

    一.runtime介绍 runtime翻译就是运行时,我们称为运行时机制.在OC中最重要的体现就是消息发送机制. 1)在C语言中,程序在编译过程中就决定调用哪个函数. 2)在OC中,编译的时候不会决定 ...

  4. block 和delegate的用法

    //block 和delegate的用法 设置代理 #import <UIKit/UIKit.h> typedef void (^ASIHeadersBlock)(NSString *my ...

  5. ios中webview的高级用法(二)

     框架: webview与js的通信框架 #import "MJViewController.h" #import "MBProgressHUD+Add.h" ...

  6. iOS 消息处理之performSelector

    ////  RootViewController.h//  DSCategories////  Created by dasheng on 15/12/17.//  Copyright © 2015年 ...

  7. iOS开发多线程篇 — GCD的常见用法

    一.延迟执行 1.介绍    iOS常见的延时执行有2种方式 (1)调用NSObject的方法 [self performSelector:@selector(run) withObject:nil ...

  8. PerformSelector

    PerformSelector 1. 执行和取消 //执行 [self performSelector:@selector(showMessage) withObject:nil afterDelay ...

  9. iOS 开发多线程篇—GCD的常见用法

    iOS开发多线程篇—GCD的常见用法 一.延迟执行 1.介绍 iOS常见的延时执行有2种方式 (1)调用NSObject的方法 [self performSelector:@selector(run) ...

随机推荐

  1. 网站推广优化(SEO,网站关键字优化,怎么优化网站,如何优化网站关键字)

    网站推广优化教程100条(完整版)下面介绍新手建站推广完美教程,各位根据自己的实际情况酌情选用: 1.准备个好域名.①.尽量在5位数内,当然也不一定,反正要让用户好记.(看个人):②.尽量用顶级的域名 ...

  2. PHP PDO的错误处理模式

    PDO默认的错误处理方式是返回一个数组格式的错误代码.如果想要判断SQL有没有出错时,就需要写一组代码来检测这个返回的数组.觉得这样有些麻烦.还好PDO还提供了另外两种处理方式,只要根据需要设置一下就 ...

  3. 【Telnet】使用Telnet协议连接到远程Shell执行脚本

    介绍 本文介绍如何通过Telnet协议连接到远程Shell,执行脚本,并获取执行结果: 相关文章: <[Jsch]使用SSH协议连接到远程Shell执行脚本>http://www.cnbl ...

  4. Adobe 软件防止联网激活更改Hosts文件

    来自为知笔记(Wiz) 附件列表

  5. CSS的一些简单概念

    行内元素与块级元素 在标准文档流里面,块级元素具有以下特点: ①总是在新行上开始,占据一整行:②高度,行高以及外边距和内边距都可控制:③宽带始终是与浏览器宽度一样,与内容无关:④它可以容纳内联元素和其 ...

  6. mysql:忘记root密码

    1:修改/etc/my.cnf 2:重启服务 3:进入mysql 4:修改密码 5:刷新权限 注意:修改完成后,别忘了修改/etc/my.cnf,删除skip-grant-tables,否则重启服务后 ...

  7. link与import的区别

  8. PL/SQL错误提示 database character set(AL32UTF8) and Client character set(ZHS16GBK) are different

    PL/SQL database character set(AL32UTF8) and Client character set(ZHS16GBK) are different 这是由于安装oracl ...

  9. Netty服务端与客户端(源码一)

    首先,整理NIO进行服务端开发的步骤: (1)创建ServerSocketChannel,配置它为非阻塞模式. (2)绑定监听,配置TCP参数,backlog的大小. (3)创建一个独立的I/O线程, ...

  10. shared_ptr 线程安全

    Then what's really happening is TWO different sections of memory are being allocated. It's done at o ...