`

【Objective-C】Selector基本概念和操作

 
阅读更多


简而言之,你可以理解 @selector()就是取类方法的编号,他的行为基本可以等同C语言的中函数指针,只不过C语言中,可以把函数名直接赋给一个函数指针,而Objective-C的类不能直接应用函数指针,这样只能做一个@selector语法来取.
   
它的结果是一个SEL类型。这个类型本质是类方法的编号(函数地址)?因此我们有如下代码。

一、取得selector值.

C函数指针

  1. int add(int val)  
  2. {  
  3.   return val+1;  
  4. }  
  5.  
  6.  
  7. int (* c_func)(int val); //定义一个函数指针变量  
  8. _func = add ;  //把函数addr地址直接赋给c_func 

Objective-C的选择器,

  1. @interface foo  
  2. -(int)add:int val;  
  3. @end  
  4.  
  5.  
  6. SEL class_func ; //定义一个类方法指针  
  7. class_func = @selector(add:int); 

注意1. @selector是查找当前类的方法,而[object @selector(方法名:方法参数..) ] ;是取object对应类的相庆方法.

注意2.查找类方法时,除了方法名,方法参数也查询条件之一.

注意3. 可以用字符串来找方法 SEL 变量名 = NSSelectorFromString(方法名字的字符串);

注意4. 可以运行中用SEL变量反向查出方法名字字符串

  1. NSString *变量名 = NSStringFromSelector(SEL参数); 

二、执行selector值.

取得相庆值后,怎么处理SEL值呢,这一点仍然与函数指针一样,就是执行它
   
函数指针执行,(以下有几种等效形式)

  1. *c_func(10);  
  2. c_func(10); 

SEL变量的执行.用performSelecor方法来执行. 

  1. [对象 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)

分享到:
评论

相关推荐

    Object-C语言教程-提供了 Objective-C 的基本语法和一些示例,希望能够帮助你快速入门 Objective-C

    Objective-C由苹果公司在其操作系统macOS和iOS的开发中广泛使用,是这两个平台上应用程序开发的主要语言之一。它的设计旨在提供更好的性能和灵活性,同时保持面向对象编程的优点。 #### 二、Objective-C的基本语法 ...

    这是一个基于Objective-C语言的基础案例集。旨在用于给初学者快速了解Objective-C语言的语法。.zip

    这个基础案例集是专为初学者设计的,目的是帮助他们迅速掌握Objective-C的基本语法和概念。以下是一些关于Objective-C的关键知识点: 1. **Objective-C的起源与特性**:Objective-C是在C语言的基础上扩展的,增加了...

    objective-c编程 第2版=objective-c program 2nd edition_13889311

    Objective-C是C语言的超集,它在C的基础上添加了面向对象的概念,如类、消息传递和协议等。这使得Objective-C既具有C的底层控制能力,又具备了现代编程语言的灵活性和可扩展性。在"Objective-C编程 第2版"中,可能...

    Objective-C基础教程源代码 Learn objective-C on the Mac Mark Dalrymple著书

    1. **Objective-C语法**:Objective-C的语法基于C语言,但引入了类、接口和消息传递等概念。这包括定义类、属性(@property)和方法(@selector)的语法,以及理解类接口(.h)和实现(.m)文件的作用。 2. **对象...

    Learn Objective-C(zh)(v2).pdf

    总之,"Learn Objective-C(zh)(v2).pdf"是一本适合初学者的中文教程,涵盖了Objective-C的基本概念、语法、内存管理和框架应用等关键内容,是进入Apple平台开发的入门良伴。通过深入学习,读者将能够熟练地使用...

    Objective-C语言核心语法

    Objective-C 的语法中,类的定义和内存管理是两个重要的概念。在Objective-C中,类不仅仅是一个蓝图,它们实际上是可以接收消息的对象。这意味着类本身是对象,它们可以响应类似于普通对象的消息。例如,`+alloc` 是...

    objective-c的一些代码

    Objective-C是一种强大的面向对象编程语言,它是Apple的iOS和macOS操作系统的核心开发语言。这篇描述提到了"objective-c的一些代码",这意味着我们将探讨Objective-C的关键概念、语法特性以及与iOS和macOS应用开发...

    Objective-C编程之道

    Objective-C是一种强大的面向对象的编程语言,主要用于Apple的Mac OS X和iOS操作系统。它在C语言的基础上添加了Smalltalk风格的消息传递机制,是苹果生态系统中开发应用程序的主要语言。本资源"Objective-C编程之道...

    Objective-C函数速查实例手册光盘 源文件

    - **类与对象**:Objective-C基于C语言,引入了类和对象的概念,支持面向对象编程。 - **协议(Protocol)**:Objective-C的协议类似于Java和C#的接口,定义了一组方法签名,可被多个类实现。 - **分类(Category...

    Objective-C示例代码1

    5. **方法定义**:Objective-C的方法定义可能包括选择器(selector)、参数列表和方法体。比如,`- (FractionDemo *)add:(FractionDemo *)otherFraction`是一个加法操作的方法。 6. **协议(Protocol)**:...

    objective-c 面向对象编程

    Objective-C是一种基于C语言的面向对象编程(OOP)语言,尤其在苹果的iOS和macOS开发中占据核心地位。它的设计目标是扩展C语言,使其支持类、消息传递和其他面向对象特性。以下是对Objective-C面向对象编程的详细...

    0基础iOS开发学习计划Objective-c语言内容概述.doc

    Objective-C是一种结合了C语言特性和面向对象编程思想的语言,它是苹果iOS和macOS应用开发的基础语言之一。Objective-C诞生于20世纪80年代,由Brace N. Koch等人设计并发展起来。随着iOS和macOS系统的流行,...

    objective-c学习资料

    Objective-C是在C语言基础上扩展的,它引入了消息传递机制和类的概念,使得C语言具备了面向对象的能力。Objective-C的语法在某些方面与C++相似,但它的动态性更强,允许在运行时修改类和方法。 2. **类与对象**: ...

    基于Objective-C的面向对象编程

    Objective-C通过方法选择器(selector)和动态类型实现多态。 10. **块(Blocks)**:Objective-C中的块是一种内联函数,可以捕获和存储执行上下文中的变量。它们常用于异步操作的回调,或者在GCD(Grand Central ...

    IOS应用源码——Objective-C基础教程 随书源码.zip

    Objective-C是苹果公司为其操作系统macOS和iOS开发的主要编程语言,它是C语言的超集,融合了Smalltalk的面向对象特性。本教程的随书源码着重于介绍Objective-C的基础知识,帮助开发者深入理解该语言的语法和特性,...

    Objective-C 基础教程-中文版

    Objective-C 是苹果公司为其操作系统,包括iOS和macOS,开发的一种面向对象的编程语言。它在C语言的基础上扩展了Smalltalk式的消息传递机制,成为Apple开发者工具Xcode中的主要编程语言。这篇“Objective-C 基础教程...

    Effective Objective-C 2.0&Obj;-C高级编程

    Objective-C是一种强大的面向对象的编程语言,特别是在iOS和macOS应用开发中占据核心地位。"Effective Objective-C 2.0&Obj-C高级编程"这个压缩包文件包含了关于这个语言的深入学习资料,旨在帮助开发者提升他们的...

    禅与 Objective-C 编程艺术

    书中可能涵盖了类、对象、继承、消息传递等基本OOP概念,以及协议、分类和Category等Objective-C特有的特性。 消息传递是Objective-C的核心,不同于其他语言的函数调用,Objective-C通过发送消息来调用方法,这赋予...

    Programming in Objective-C 5th Edition

    Objective-C是苹果公司在其操作系统(如macOS和iOS)开发中的首选语言之一。 《Programming in Objective-C》第五版由Stephen G. Kochan编写,该书主要介绍了Objective-C的基础语法与面向对象编程的核心概念。本书...

    Objective-C 教程集合

    这个教程集合涵盖了Objective-C语言的基本概念,Cocoa框架的使用,以及iOS和macOS开发的关键技术。通过这些资源,无论是初学者还是有一定经验的开发者,都能提升自己的Objective-C技能,更好地开发Apple平台的应用...

Global site tag (gtag.js) - Google Analytics