简而言之,你可以理解 @selector()就是取类方法的编号,他的行为基本可以等同C语言的中函数指针,只不过C语言中,可以把函数名直接赋给一个函数指针,而Objective-C的类不能直接应用函数指针,这样只能做一个@selector语法来取.
它的结果是一个SEL类型。这个类型本质是类方法的编号(函数地址)?因此我们有如下代码。
一、取得selector值.
C函数指针
- int add(int val)
- {
- return val+1;
- }
-
-
- int (* c_func)(int val); //定义一个函数指针变量
- _func = add ; //把函数addr地址直接赋给c_func
Objective-C的选择器,
- @interface foo
- -(int)add:int val;
- @end
-
-
- SEL class_func ; //定义一个类方法指针
- class_func = @selector(add:int);
注意1. @selector是查找当前类的方法,而[object @selector(方法名:方法参数..) ] ;是取object对应类的相庆方法.
注意2.查找类方法时,除了方法名,方法参数也查询条件之一.
注意3. 可以用字符串来找方法 SEL 变量名 = NSSelectorFromString(方法名字的字符串);
注意4. 可以运行中用SEL变量反向查出方法名字字符串
- NSString *变量名 = NSStringFromSelector(SEL参数);
二、执行selector值.
取得相庆值后,怎么处理SEL值呢,这一点仍然与函数指针一样,就是执行它
函数指针执行,(以下有几种等效形式)
- *c_func(10);
- c_func(10);
SEL变量的执行.用performSelecor方法来执行.
- [对象 performSelector:SEL变量 withObject:参数1 withObject:参数2];
三.selector的应用场合
selector本质是跟C的回调函数一样。主要用于两个对象之间进行松耦合的通讯.这种方法很多开发环境用到。比如GTK,Delphi.基本上整个Cocoa库之间对象,控制之间通讯都是在这个基础构建的。
在Objective C中,selector有两个含义。
1. 当在源代码中发消息给对象的时候,selector指的是方法名
2. 当源代码被编译后,指的是替代方法名的唯一标识符(identifier)
编译后的selector的类型是SEL, 所有具有相同方法名的方法有相同的selector
你可以用selector来调用一个object的方法----->这个为Cocoa中target-action的设计模式提供了基础
method and selector
从效率上说,编译后的代码中,ASCII的名字不会被用做方法的selector,编译器会把方法名写到一张表格里,用一个唯一的标识符(identifier)与它对应
并且在运行时用这个标识符来表示方法。标识符是唯一的,selector也是唯一的,没有两个相同的标识符或者selector。
SEL and @selector
为了区别于其他的数据类型,编译后的selector的类型为SEL。 指令@selector可以引用编译后的selector,这个要比使用方法名要有效率。
Methods and selectors
编译后的方法指示方法名,而不是方法的实现。这是多态和动态绑定的基础。这能让你发送相同的消息给不同的类的接收器,如果类方法名和对象方法名一样,
那么他们的selector标识符也是一样的,但是这不会冲突,首先selecotr标示符不是方法的实现,只代表方法名,其次类方法名和对象方法名属于不同的域。
Method Return and Parameter Types
消息程序只能通过selector来访问方法的实现,所以对待所有具有相同selector的方法都是一样的。消息程序通过selector来获取返回类型和参数的类型
因此动态绑定需要所有具有相同名字的方法的实现有相同的return类型和相同的参数类型。
Varying the Message at Runtime
performSelector:
performSelector:withObject:
performSelector:withObject:withObject:
以上3个定义在NSObject protocol里的方法,把SEL标识符作为他们的初始参数。3个方法都直接映射到消息函数,举个例子,
[friend performSelector:@selector(gossipAbout:)withObject:aNeighbor];
相当于
[friend gossipAbout:aNeighbor];
有了这些方法,消息和接收对象在运行时是可变的。变量名可以用在消息表达式里,例:
id helper = getTheReceiver();
SEL request = getTheSelector();
[helper performSelector:request];
The Target-Action Design Pattern
在处理用户界面控制时,Appkit对于可变消息和可变接收对象运用的很好。例:
[myButtonCell setAction:@selector(reapTheWind:)];
[myButtonCell setTarget:anObject];
几个方法:
1. SEL val = @selector(method);
2. SEL val = NSSelectorFromString(methodString)
3. NSString *methodString = NSStringFromSelector(sel_val)
分享到:
相关推荐
Objective-C由苹果公司在其操作系统macOS和iOS的开发中广泛使用,是这两个平台上应用程序开发的主要语言之一。它的设计旨在提供更好的性能和灵活性,同时保持面向对象编程的优点。 #### 二、Objective-C的基本语法 ...
这个基础案例集是专为初学者设计的,目的是帮助他们迅速掌握Objective-C的基本语法和概念。以下是一些关于Objective-C的关键知识点: 1. **Objective-C的起源与特性**:Objective-C是在C语言的基础上扩展的,增加了...
Objective-C是C语言的超集,它在C的基础上添加了面向对象的概念,如类、消息传递和协议等。这使得Objective-C既具有C的底层控制能力,又具备了现代编程语言的灵活性和可扩展性。在"Objective-C编程 第2版"中,可能...
1. **Objective-C语法**:Objective-C的语法基于C语言,但引入了类、接口和消息传递等概念。这包括定义类、属性(@property)和方法(@selector)的语法,以及理解类接口(.h)和实现(.m)文件的作用。 2. **对象...
总之,"Learn Objective-C(zh)(v2).pdf"是一本适合初学者的中文教程,涵盖了Objective-C的基本概念、语法、内存管理和框架应用等关键内容,是进入Apple平台开发的入门良伴。通过深入学习,读者将能够熟练地使用...
Objective-C 的语法中,类的定义和内存管理是两个重要的概念。在Objective-C中,类不仅仅是一个蓝图,它们实际上是可以接收消息的对象。这意味着类本身是对象,它们可以响应类似于普通对象的消息。例如,`+alloc` 是...
Objective-C是一种强大的面向对象编程语言,它是Apple的iOS和macOS操作系统的核心开发语言。这篇描述提到了"objective-c的一些代码",这意味着我们将探讨Objective-C的关键概念、语法特性以及与iOS和macOS应用开发...
Objective-C是一种强大的面向对象的编程语言,主要用于Apple的Mac OS X和iOS操作系统。它在C语言的基础上添加了Smalltalk风格的消息传递机制,是苹果生态系统中开发应用程序的主要语言。本资源"Objective-C编程之道...
- **类与对象**:Objective-C基于C语言,引入了类和对象的概念,支持面向对象编程。 - **协议(Protocol)**:Objective-C的协议类似于Java和C#的接口,定义了一组方法签名,可被多个类实现。 - **分类(Category...
5. **方法定义**:Objective-C的方法定义可能包括选择器(selector)、参数列表和方法体。比如,`- (FractionDemo *)add:(FractionDemo *)otherFraction`是一个加法操作的方法。 6. **协议(Protocol)**:...
Objective-C是一种基于C语言的面向对象编程(OOP)语言,尤其在苹果的iOS和macOS开发中占据核心地位。它的设计目标是扩展C语言,使其支持类、消息传递和其他面向对象特性。以下是对Objective-C面向对象编程的详细...
Objective-C是一种结合了C语言特性和面向对象编程思想的语言,它是苹果iOS和macOS应用开发的基础语言之一。Objective-C诞生于20世纪80年代,由Brace N. Koch等人设计并发展起来。随着iOS和macOS系统的流行,...
Objective-C是在C语言基础上扩展的,它引入了消息传递机制和类的概念,使得C语言具备了面向对象的能力。Objective-C的语法在某些方面与C++相似,但它的动态性更强,允许在运行时修改类和方法。 2. **类与对象**: ...
Objective-C通过方法选择器(selector)和动态类型实现多态。 10. **块(Blocks)**:Objective-C中的块是一种内联函数,可以捕获和存储执行上下文中的变量。它们常用于异步操作的回调,或者在GCD(Grand Central ...
Objective-C是苹果公司为其操作系统macOS和iOS开发的主要编程语言,它是C语言的超集,融合了Smalltalk的面向对象特性。本教程的随书源码着重于介绍Objective-C的基础知识,帮助开发者深入理解该语言的语法和特性,...
Objective-C 是苹果公司为其操作系统,包括iOS和macOS,开发的一种面向对象的编程语言。它在C语言的基础上扩展了Smalltalk式的消息传递机制,成为Apple开发者工具Xcode中的主要编程语言。这篇“Objective-C 基础教程...
Objective-C是一种强大的面向对象的编程语言,特别是在iOS和macOS应用开发中占据核心地位。"Effective Objective-C 2.0&Obj-C高级编程"这个压缩包文件包含了关于这个语言的深入学习资料,旨在帮助开发者提升他们的...
书中可能涵盖了类、对象、继承、消息传递等基本OOP概念,以及协议、分类和Category等Objective-C特有的特性。 消息传递是Objective-C的核心,不同于其他语言的函数调用,Objective-C通过发送消息来调用方法,这赋予...
Objective-C是苹果公司在其操作系统(如macOS和iOS)开发中的首选语言之一。 《Programming in Objective-C》第五版由Stephen G. Kochan编写,该书主要介绍了Objective-C的基础语法与面向对象编程的核心概念。本书...
这个教程集合涵盖了Objective-C语言的基本概念,Cocoa框架的使用,以及iOS和macOS开发的关键技术。通过这些资源,无论是初学者还是有一定经验的开发者,都能提升自己的Objective-C技能,更好地开发Apple平台的应用...