首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

在Objective C中,我可以使用普通函数而不是方法选择器作为事件处理程序吗?

在Objective C中,可以使用普通函数作为事件处理程序,而不是方法选择器。普通函数可以直接作为事件处理程序,无需使用方法选择器来进行处理。这种方式在一些简单的场景下非常方便,可以直接定义一个普通函数来处理事件,而不需要创建一个专门的方法。然而,需要注意的是,普通函数无法直接访问类的实例变量和方法,因此在处理事件时需要注意传递参数或者使用全局变量来进行数据的传递。在Objective C中,可以使用以下方式来定义和使用普通函数作为事件处理程序:

  1. 定义普通函数:void handleEvent() { // 处理事件的逻辑代码 }
  2. 将普通函数作为事件处理程序:[button addTarget:self action:@selector(handleEvent) forControlEvents:UIControlEventTouchUpInside];

在上述代码中,handleEvent就是一个普通函数,通过addTarget:action:forControlEvents:方法将其作为按钮的事件处理程序。当按钮被点击时,handleEvent函数将被调用。

需要注意的是,使用普通函数作为事件处理程序可能会导致代码的可读性和维护性降低,因为无法直接访问类的实例变量和方法。因此,在实际开发中,建议根据具体情况选择使用普通函数还是方法选择器作为事件处理程序。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Objective C (iOS) for Qt C++ Developers(iOS开发,Qt开发人员需要了解什么?)

Qt/C++开发人员眼中的Obj-C 对于我们第一次自己定义iOS应用来说,对于来自Qt/C++开发人员来说,不得不学习Objective-C相关语法与知识 为了让读者可以更easy...全然不同(起初很分散)是Obj-C函数的调用方法,类似通常的C-ish方式,比如NSLog(@“的日志消息”);但也有Obj-C语法对象的调用方法。...Objective C,这是通常被称为发送消息,不不过它的调用方法,还有好多发现更加混乱. 在上面这种方法演示样例,methodName是所谓的选择器。一个选择器是一个方法的标识符。...你能想象Objective C托付作为一组插槽。托付对象的一个托付方法被对象调用通知某些事情已经发生。...NSRunLoop相当于Qt的QEventLoop 。 假设你还有一个线程处理事情和须要一个事件循环,比如网络IO。 那您能够使用它来处理

91610

Objective-C Runtime编程指南(1)

二、使用Runtime Objective-C程序与运行时系统在三个不同的层次上进行交互:通过Objective-C源代码; 通过Foundation框架的NSObject类定义的方法; 通过直接调用运行时功能...这些函数的许多函数允许您使用plain C来复制编译Objective-C代码时编译器的功能。 其他形成了通过NSObject类的方法导出功能的基础。...一个方法将接收对象称为self,并将其作为_cmd自己的选择器。 在下面的例子,_cmd指向strange方法选择器自己指向接收strange消息的对象。...Objective-C方法只是一个C函数,它至少需要两个参数self和_cmd。 您可以使用函数class_addMethod将函数添加到类。...同时,为了使应用程序的其他对象正常工作,至少需要该对象的占位符。 在这种情况下,你最初可以创建,不是完整的对象,而是一个轻量级的替代品。

76320

汇编寄存器的规则

", name, 30, @"my father's basement"); NSLog 函数调用传递了四个参数。 其中一些值按原样传递,一个参数存储局部变量,然后函数作为参数引用。...必须在函数调用开始时停止以查看或修改参数,不必实际进入程序集。 # Objective-C 和寄存器 如上一节所述,寄存器使用特定的调用规则。 您也可以将该知识其应用于其他语言。...判断是否有参数的一种简单方法是简单地检查 Objective-C 选择器的冒号。 每个冒号将代表一个方法的参数。...还记得RDI是第一个参数,RSI是第二个参数?LLDB可以通过 arg1 引用第一个参数 (RDI)。随着示例的进行,您可以使用 $arg2 引用第二个参数 (RSI),以此类推。...经常发现,即使确实有源代码的应用程序使用方法也更快,然后应用程序中看到数千个 IBAction。 ... 但仅出于演示目的,让我们将其应用于 iOS Maps 应用程序

2.4K50

求职 | 史上最全的web前端面试题汇总及答案2

null: (1) 作为函数的参数,表示该函数的参数不是对象。 (2) 作为对象原型链的终点。...19、你js中用过array?如果用过,array添加数据用什么方法?...所以它往往AJAX替代XML,交换数据。 6、你的项目中有使用到跨域?你项目中是如何处理JS跨域问题的? ①有。 ②主要是使用其它网站提供的javascript api如QQ。...使用script的src可以直接读取跨域资源。 ③当然跨域还有其它处理方式:如代理服务器、改变domain、JSONP等。 7、你项目中有使用到网页到服务器的即时通信?...3、jQuery如何注册事件使用bind()方法注册事件,但通常我们使用事件同名的方法注册更方便,如:click()、hover()等。 4、如何获取Html内容?如何获取文本内容?

6K20

动态的Objective-C——关于消息机制与运行时的探讨

动态的Objective-C——关于消息机制与运行时的探讨 一、引言     Objective-C是一种很优美的语言,至少使用其进行编程的过程,是很享受他那近乎自然语言的函数命名、灵活多样的方法调用方式以及配合...,Objective-C库头文件没有找到objc_selector结构体的定义,但我们可以合理猜测,其中很有可能包含的是一个函数指针。...,可以如果接收对象无法处理,其父类,父父类...等都无法处理,那么该怎么办呢,Objective-C为了增强语言的动态性,如果真的出现了这种情况,程序并不会马上crash,crash前,有3次机会可以挽救本条消息的命运...通过上面的三根救命稻草,相信你一定对Objective-C消息机制有了全面深入的了解,上面的代码也只是为了示例所用,正常情况下,你都不会使用到这些函数(毕竟如果你需要救命稻草,说明你已经落水了)。...这条消息处理的两个要素是:当前MyObjectSon实例对象作为接收者,NSObject类的className方法作为调用函数

78540

iOS进阶之传递消息

C语言使用“静态绑定”,也就是说,在编译器就能决定运行时所应调用的函数如果待调用的函数地址无法硬编码指令之中,就要在运行期读取出来,使用“动态绑定”。...Objective-C,如果向某对象传递消息,那就会使用动态绑定机制来决定需要调用的方法。...底层,所有方法都是普通C语言函数,然而对象收到消息后,究竟该调用哪个方法则完全于运行期决定,甚至可以程序运行时改变,这些特性使得Objecttive-C成为一门真正的动态语言。...加入真是个瓶颈的话,那你可以只编写纯C函数调用根据需要,把Objective-C对象的状态传进去。...这项优化对objc_msgSend非常关键,如果不这么做的话,那么每次调用Objective-C方法之前,都需要为调用objc_msgSend函数准备“栈帧”,大家“栈踪迹”可以看到这种“栈帧”。

76060

【IOS开发高级系列】Objective-c Runtime专题总结

这个时候我们知道Objective-C的object最后会被转换成C的结构体Class,而在这个struct中有一个 isa 指针,指向它的类别 Class(PS:这里还不是Meta Class)。...这里的原因主要是因为C,局部变量是存储到内存的栈区,程序运行时栈的生长规律是从地址高到地址低。C语言到头来讲是一个顺序运行的语言,随着程序运行,栈的地址依次往下走。        ...我们可以实现 forwardInvocation: 方法来对不能处理的消息做一些默认的处理,也可以将消息转发给其他对象来处理不抛出错误。        ...使用函数objc_removeAssociatedObjects可以断开所有关联。通常情况下不建议使用这个函数,因为他会断开所有关联。只有需要把对象恢复到“原始状态”的时候才会使用这个函数。...其实,这里还可以更简化点:直接用新的 IMP 取代原 IMP ,不是替换。只需要有全局的函数指针指向原 IMP 就可以

33630

成为一名优秀 Swift 开发人员的 10 个小技巧

使用标记 从 Objective-C 开始,就一直很喜欢标记。当控制器有成百上千行代码时,标记就显得很重要了。使用标签来分割和管理代码非常重要,可以代码快速导航。...Xcode 11 右侧有一个代码导航器,基于此可以更频繁地使用标记。 4. 首先代码来实现导航,不是 Storyboard Storyboard 很好,自从 Apple 推出后,就一直使用。...为项目选择正确的库是一项有意思的工作,大多数情况下,使用基本库就正确的做法。这可以让你专注于特定应用程序的特定功能,不是常见的功能上浪费时间。...使用扩展并合理使用它们来创建公共库 很喜欢 Swift 扩展。使用 Objective-C 时,总是不情愿地使用继承。当然这并不总是错误的,正确的使用子类也不会出错。...事件操作 sender 参数非常有用 最后一个技巧是使用 sender 参数。每个响应事件方法选择器可以知道是谁触发了事件

2.3K40

2019最新iOS面试题及答案

答:KVC:键 – 值编码是一种间接访问对象的属性使用字符串来标识属性,不是通过调用存取方法,直接或通过实例变量访问的机制。很多情况下可以简化程序代码。apple文档其实给了一个很好的例子。...说说响应链 答: 事件响应链。包括点击事件,画面刷新事件等。视图栈内从上至下,或者从下之上传播。可以说点事件的分发,传递以及处理。具体可以去看下touch事件这块。...类里面声名一个私有方法 @private可以用来修饰私有变量 ObjectiveC,所有实例变量默认都是私有的,所有实例方法默认都是公有的 64.Object-C有多继承?...文件include的头文件,也不能出现obj-c的代码,因为cpp只是cpp 2).mm文件混用cpp直接使用即可,所以obj-c混cpp不是问题 3).cpp混用obj-c其实就是使用obj-c...: #define 语法的基本知识(例如:不能以分号结束,括号的使用,等等)懂得预处理器将为你计算常数表达式的值,因此,直接写出你是如何计算一年有多少秒不是计算出实际的值,是更清晰没有代价的。

2.3K20

Sketch 插件开发官方文档合集插件基础您的第一个插件开发环境调试ActionAPI发布插件插件捆绑插件,脚本和命令插件位置更多关于CocoaScriptSketchTool参考资源

Sketch使用Objective-C构建,其类被桥接到JavaScript。知道你正在处理哪些类以及定义了哪些方法通常很有用。 您可以使用由网桥定义的一些自省方法来访问这些信息。...如何注册的插件来“聆听”一个操作? 简单:你只需manifest.json你的插件已有的文件添加一个处理程序。...这些命令的每一个实际上都是作为一个JavaScript函数实现的(我们称之为处理程序),位于该包的脚本文件。...基础如下: 你会像往常一样编写JavaScript代码 使用桥接器,您可以从主机应用程序本例为Sketch)或从系统本身获取Objective-C对象 基本的Objective-C对象具有等同的JavaScript...Objective-C方法作为对象的不透明JavaScript代理的属性公开。 将选择器名称转换为JavaScript属性名称时采取以下步骤: 所有冒号都转换为下划线(最新的下划线是可选的)。

6.3K90

iOS RunTime之二:数据结构

我们知道Objective-C使用[object doSomething]语法并不会马上执行object接受者对象的doSomething方法的代码,而是向object接受者对发送一条doSomething...消息,这条消息可能由object接受者对来处理,也可能由转发给其他对象来处理,也有可能假装没有接收到这条消息没有处理。...Objective-C的设计者让所有的meta-class的isa指向基类的meta-class,以此作为它们的所属类。...Objective-C,只要方法名相同,那么方法的SEL就是一样的,每一个方法都对应着一个SEL,所以Objective-C,同一个类或者这个类的继承体系,不能存在2个同名的方法,不同的类可以拥有相同的...因此我们可以通过SEL获得它所对应的IMP,取得了函数指针之后,也就意味着我们取得了需要执行方法的代码入口,这样我们就可以普通C语言函数调用一样使用这个函数指针。 ?

55620

runtime官方文档翻译版本通过OC源代码通过NSObject定义的方法直接调用运行时的函数消息传递机制使用隐藏参数获取方法地址动态方法解析动态加载消息转发转发和多继承代理对象转发和继承类型编码声

现在的运行时可以直接编译。 iPhone应用程序和64程序OX v10.5和以后使用现在版本的运行时。其他项目的使用的都是以前版本的运行时。...所有的功能都记录在Objective-C Runtime Reference.。 消息传递机制 这一部分描述了如何把消息表达式转换成objc_msgSend函数调用,怎样通过名字找到方法。...查找调度表之前,消息例行程序首先会在接收者对象的类的缓存查找。(理论上来说,用过一次的方法很可能再次被使用)如果方法选择器缓存里面,消息传递只会比函数调用慢一点。...这些参数被隐藏在方法的语法但是在这个方法作为一个函数调用的时候必须明确。 使用methodForSelector:规避动态绑定可以节省大多数信息传递的时间。...即使runtime函数提供了Objective-C Mach-O文件动态加载模块,然而Cocoa的NSBundle类提供了一个面向对象的动态加载和相关服务集成更方便的接口。

1.5K70

【IOS开发高级系列】Lua与OC交互专题

这种转换功能强大,甚至可以处理复杂的Objective-C特性,比如选择器。         你可以利用所有上述特性。不需要精挑细选。你获得所有特性!...那是由于你使用Lua构建一个AppDelegate类;苹果和苹果的代码看来,你使用Objective-C、构建Objective-C类!...Lua函数名称不能有冒号。为了补偿这个差异,凡是Objective-C中隔开方法名称的地方,Lua中都换成下划线。...你添加到该Lua文件的所有之后的函数(同一个文件里面)都会作为实例方法,自动添加到新的类。         ...不是使用“.”操作符Lua中进行“方法”调用,而是使用了“:”操作符: [pre] local view = UIView.initWithFrame(CGRect(0, 0, 100, 100))

30020

音频开发中常见的四个错误

问题的关键在于:Objective-C和Swift持有锁是其正常操作的一部分。 Objective-C的消息发送系统(即调用Obj-C方法)的背后,是一系列包括持有锁在内的完成工作所需的必要代码。...首先,Objective-C围绕C构建,并且实际上可以C结构一样从implementation块C函数访问Objective-C,示例如下: FFCrewMember * jayne; ... jayne...在所有的现代处理器上,你可以安全赋值给一个int,double,float,bool,BOOL或在一个线程的指针变量并读取其不同的线程不用担心线程被打断。...如果您使用的是32位处理器,并且分配了一个uint64_t 变量,您可能会遇到麻烦,因为处理器需要两条单独的指令来存储值,另一个线程可以在读取过程中途读取该值。...其 被内置于 AmazingAudio Engine 2 作为AECircularBuffer。

1.1K40

全网最新、最全的jQuery核心知识,你真的不想点开看看嘛?

为什么使用 jQuery 它能够兼容市面上主流的浏览器, IE 和 FireFox,Google 浏览器 处理 AJAX,创建异步对象是不同的, jQuery 能够使用一种方式不同的浏览器创建 AJAX...事件名称(事件处理函数) $(选择器) :定位dom对象,dom对象可以有很多个,这些dom对象都绑定了这个事件 事件名称 : 就是js事件去掉on的部分,例如:js的单击事件 onclick(...例如:给id是btn的按绑定单击事件 $("#btn").click(function(){ ​ alert("btn按钮单击了"); }) 12.2 on 事件绑定 on() 方法在被选元素上添加事件处理程序...该方法给 API 带来很多便利,推荐使用方法 语法 :$("选择器").on( "事件名称" ,事件处理函数) 事件名称 : 就是js事件中去掉on的部分 (jsonclick on事件 click...注意:以下设置的内容是书写代码时标签的在网页显示文本内容,不是设置网页上显示的内容。

5.8K10

iOSCocoa框架·Runtime及isa指针知识·填坑

是什么因素使一个程序成为Cocoa程序呢?不是编程语言,因为Cocoa开发可以使用各种语言;也不是开发工具,你可以命令行上就可以创建Cocoa程序。...NSThread类使您可以创建多线程的程序各种锁(lock)类则为彼此竞争的线程访问进程资源时提供各种控制机制。...Paste_Image.png 图中可以看出,responder 类是图中最大分支的根类,UIResponder为处理响应事件和响应链 定义了界面和默认行为。...当用户用手指滚动列表或者虚拟键盘上输入时,UIKit就生成时间传送给UIResponder响应链,直到链中有对象处理这个事件。...(为了区分两个对象,把前面提到的对象叫Objective-C对象),包括Objective-C对象的方法调度表,实现了什么协议等等。

96520

iOS学习——iOS 整体框架及类继承框架图

由于应用程序的结构是通用的,开发者通过框架提供的函数方法,做细致个性化的处理,从而满足不同应用的不同需求。...NSThread类使您可以创建多线程的程序各种锁(lock)类则为彼此竞争的线程访问进程资源时提供各种控制机制。通过NSTask,您的程序可以分出一个子进程来执行其它工作或进行进度监控。...框架的入口: #import   ,当引入此头文件后,便可以程序使用任何在UIKit里声明的类。(PS: 当然还要把这个框架链接到你的应用程序)。...图中可以看出,responder 类是图中最大分支的根类,UIResponder为处理响应事件和响应链 定义了界面和默认行为。...(为了区分两个对象,把前面提到的对象叫Objective-C对象),包括Objective-C对象的方法调度表,实现了什么协议等 等。

3.4K70

RunTime 之使用前须知

详情可看:iOS编译过程的原理和应用 编译器前端(Objective C采用Clang作为前端,Swift则采用swift()作为前端) 编译器前端的任务是进行:语法分析,语义分析...运行时: 即程序通过了编译这一关之后编译好的代码被装载到内存跑起来的阶段,运行时类型检查就与前面讲的编译时类型检查(或者静态类型检查)不一样.不是简单的扫描代码.而是在内存做些操作,做些判断,此时若出错程序会崩溃...如何理解消息机制: (1)Objective-C,message与方法执行阶段绑定的,不是编译阶段。...(比如.h声明了方法,但.m没有实现,就可以重现这个错误) Objective-C 语言中,每一个类实际上也是一个对象。每一个类也有一个名为 isa 的指针。...几个重要的辅助函数 可以使用过程起到很好的辅助作用,尤其是动态编译等起到了比较大的作用。

70720

iOS开发 —— Runtime

这就是 Objective-C Runtime 系统存在的意义,它是整个Objc运行框架的一块基石。 Runtime基本是用C和汇编写的,可见苹果为了动态系统的高效作出的努力。...消息传递的过程 Objective-C ,类、对象和方法都是一个 C 的结构体,从 objc/objc.h 头文件,我们可以找到他们的定义。...具体的定义分析可以的另一篇 解释 Runtime 各种方法、属性的定义中去学习。 从这些定义可以看出发送一条消息也就 objc_msgSend 做了什么事。...但是在这个异常抛出之前,我们的 Objective-C 尝试过用三种方法来拯救我们的程序。...利用 Objective-C 的 Runtime 特性,我们可以自己来对语言进行扩展,解决项目开发的一些设计和技术问题。

1.2K30

用模拟执行实现Objective-C代码自动化分析

这里还有其他的几个有用的程序,正如以前FLARE脚本系列的其他博客中介绍的那样,自动函数参数提取和自动混淆字符串解码,该技术可用于跟踪整个程序传递给给定函数的参数。...flare-emu旨在处理所有内务处理,为其支持的体系结构设置灵活强大的仿真器,以便您专注于解决代码分析问题。 当前,它提供了三种不同的接口来满足您的仿真需求,以及一系列相关的帮助程序和实用功能。...用户可以指定目标地址列表,也可以指定函数的地址(从中使用对该函数的交叉引用的列表)作为目标,并指定达到目标时的回调。无论仿真期间可能导致采用不同分支的条件如何,都将达到目标。...,不知道有没有说错的地方) 去年,写了一篇博客文章向您介绍逆向macOS平台的Cocoa应用程序,文章地址在这里,该帖子包括一个简短的入门文章,介绍如何在后台调用Objective-C方法,以及这如何对...objc2_xrefs_helper的主要缺点是,如果选择器名称含糊不清,则意味着两个或多个类实现了具有相同名称的方法,脚本无法确定引用的选择器二进制文件任何给定位置所属的类,所以修复交叉引用时不得不忽略这种情况

84030
领券