NSObject方法: - (id)forwardingTargetForSelector:(SEL)aSelector;+ (BOOL)resolveInstanceMethod:(SEL)sel;

1.(forwardingTargetForSelector):{

  forwardingTargetForSelector是NSObject的函数,用户可以在派生类中对其重载,从而将无法处理的selector转 发给另一个对象。还是以上面的uppercaseString为例,如果用户自己定义的CA类的对象a,没有uppercaseString这样一个实例 函数,那么在不调用respondSelector的情况下,直接执行[a performSelector:@selector"uppercaseString"],那么执行时一定会crash,此时,如果CA实现了 forwardingTargetForSelector函数,并返回一个NSString对象,那么就相对于对该NSString对象执行了 uppercaseString函数,此时就不会crash了。当然实现这个函数的目的并不仅仅是为了程序不crash那么简单,在实现装饰者模式时,也 可以使用该函数进行消息转发。

}

2(resolveInstanceMethod){

  这 个函数与forwardingTargetForSelector类似,都会在对象不能接受某个selector时触发,执行起来略有差别。前者的目 的主要在于给客户一个机会来向该对象添加所需的selector,后者的目的在于允许用户将selector转发给另一个对象。另外触发时机也不完全一 样,该函数是个类函数,在程序刚启动,界面尚未显示出时,就会被调用。

  在类不能处理某个selector的情况下,如果类重载了该函数,并使用class_addMethod添加了相应的selector,并返回YES,那么后面forwardingTargetForSelector 就不会被调用,如果在该函数中没有添加相应的selector,那么不管返回什么,后面都会继续调用 forwardingTargetForSelector,如果在forwardingTargetForSelector并未返回能接受该 selector的对象,那么resolveInstanceMethod会再次被触发,这一次,如果仍然不添加selector,程序就会报异常.
}

时间: 2024-10-27 11:51:18

NSObject方法: - (id)forwardingTargetForSelector:(SEL)aSelector;+ (BOOL)resolveInstanceMethod:(SEL)sel;的相关文章

iOS 一个新方法:- (void)makeObjectsPerformSelector:(SEL)aSelector;

NSArray 里面的一个方法, - (void)makeObjectsPerformSelector:(SEL)aSelector: 这是一个类似于执行for循环的方法,可以这样用,当需要删除一个view里面的所有subViews,代码如下: [self.subviews makeObjectsPerformSelector:@selector(removeFromSuperview)]; 当要设置一个view里面所有子view的隐藏属性的时候,代码如下: [self.subviews mak

【iOS开发系列】NSObject方法介绍

NSObject是OC中的基类,全部类都继承于此,这里面也给我们提供了非常多与"类"和"方法"相关的方法,本文将解说几个非常有用的方法. 正文: Person.h #import <Foundation/Foundation.h> @interface Person : NSObject @end</span> Student.h #import "Person.h" // 继承Person类 @interface Stu

id、NSObject *、id&lt;NSObject&gt;、instancetype的区别

1. id 与 NSObject * (1) id 是 Objective-C 对象,但是并不一定是NSObject对象,并非所有的Foundation/Cocoa对象都是继承于NSObject对象的,比如NSProxy.同时,id与NSObject对象之间有很多的共同方法,比如retain与release等方法.更一步来说:所有的对象本质来说都是 id 类型的. (2) 对于id来说,你可以调用任意可见的selector,编译器和IDE不会进行类型检查,这个时候就需要你自己进行类型检查并且进行

id、NSObject *、id&lt;NSObject&gt;、instancetype

1. id 与 NSObject * (1) id 是 Objective-C 对象,但是并不一定是NSObject对象,并非所有的Foundation/Cocoa对象都是继承于NSObject对象的,比如NSProxy.同时,id与NSObject对象之间有很多的共同方法,比如retain与release等方法.更一步来说:所有的对象本质来说都是 id 类型的. (2) 对于id来说,你可以调用任意可见的selector,编译器和IDE不会进行类型检查,这个时候就需要你自己进行类型检查并且进行

iOS开发中id、NSObject *、id、instancetype四者有什么区别?

在使用Objective-C语言进行iOS应用开发的时候,常常会涉及到id.NSObject *.id.instancetype这四个概念的使用,但这四者也是iOS初学者最易混淆的内容,下面小编看了一些iOS开发教程和文档,搜罗了他们的不同用法,分享给大家,一起来看看吧. 1. id与NSObject * (1)id是Objective-C对象,但是并不一定是NSObject对象,并非所有的Foundation/Cocoa对象都是继承于NSObject对象的,比如NSProxy.同时,id与NS

JNI由浅入深_8_JNI缓存字段和方法ID

获取字段ID和方法ID时,需要用字段.方法的名字和描述符进行一个检索.检索过程相对比较费时,因此本节讨论用缓存技术来减少这个过程带来的消耗.缓存字段ID和方法ID的方法主要有两种.两种区别主要在于缓存发生的时刻,是在字段ID和方法ID被使用的时候,还是定义字段和方法的类静态初始化的时候. 1.使用时缓存 字段ID和方法ID可以在字段的值被访问或者方法被回调的时候缓存起来.下面的代码中把字段ID存储在静态变量当中,这样当本地方法被重复调用时,不必重新搜索字段ID. JNIEXPORT void J

Objective-C数据类型之id,SEL,BOOL,nil,NULL和NSNull

 id id是指向Objective-C对象的指针,等价于C语言中的void*,可以映射任何对象指针指向他,或者映射它指向其他的对象.常见的id类型就是类的delegate属性. SEL SEL类型是Objective-C用来定义方法的关键字,但却从不属于任何类实例,其值是通过@selector进行计算,可以把她当做一个函数指针来使用,但实际上的类型是const char*.SEL类系可以在编译时通过@selector()直接创建,也可以用NSSelectorFromString()函数创建,这

[编写高质量iOS代码的52个有效方法](三)消息和运行期

[编写高质量iOS代码的52个有效方法](三)消息和运行期 参考书籍:<Effective Objective-C 2.0> [英] Matt Galloway 先睹为快 11.理解objc_msgSend的作用 12.理解消息转发机制 13.用"方法调配技术"调试"黑盒方法" 14.理解"类对象"的用意 目录 编写高质量iOS代码的52个有效方法三消息和运行期 先睹为快 目录 第11条理解objc_msgSend的作用 第12条理解

NSObject之一

Objective-C中有两个NSObject,一个是NSObject类,另一个是NSObject协议.而其中NSObject类采用了NSObject协议.在本文中,我们主要整理一下NSObject类的使用. 说到NSObject类,写Objective-C的人都应该知道它.它是大部分Objective-C类继承体系的根类.这个类提供了一些通用的方法,对象通过继承NSObject,可以从其中继承访问运行时的接口,并让对象具备Objective-C对象的基本能力.以下我们就来看看NSObejct提