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

当需要self的参数时,如何使用#selector调用另一个类中的函数?

当需要self的参数时,可以使用#selector调用另一个类中的函数的步骤如下:

  1. 首先,确保另一个类中的函数是公开可访问的,即使用publicopen修饰符进行声明。
  2. 在当前类中,创建一个函数,该函数的参数类型必须与另一个类中的函数相匹配。在这个函数中,使用#selector关键字来引用另一个类中的函数。
  3. 使用#selector关键字时,需要使用target-action模式。因此,另一个类中的函数应该是一个带有@objc修饰符的方法。
  4. 在当前类中,使用perform(_:with:afterDelay:)方法来调用另一个类中的函数。这个方法接受两个参数:第一个参数是通过#selector关键字引用的函数,第二个参数是需要传递给另一个类中函数的参数。

下面是一个示例代码,演示了如何使用#selector调用另一个类中的函数:

代码语言:txt
复制
class AnotherClass: NSObject {
    @objc func someFunction(parameter: Int) {
        // 在这里实现另一个类中的函数逻辑
    }
}

class CurrentClass {
    func callAnotherFunction() {
        let anotherClassInstance = AnotherClass()
        let parameter = 10
        
        // 使用#selector调用另一个类中的函数
        let selector = #selector(AnotherClass.someFunction(parameter:))
        
        // 使用perform(_:with:afterDelay:)方法调用另一个类中的函数
        anotherClassInstance.perform(selector, with: parameter, afterDelay: 0)
    }
}

在上面的示例中,AnotherClass是另一个类,其中包含了一个名为someFunction的函数。CurrentClass是当前类,其中的callAnotherFunction函数使用了#selectorperform(_:with:afterDelay:)来调用AnotherClass中的someFunction函数,并传递了一个参数。

请注意,这只是一个示例,实际使用中需要根据具体情况进行调整。另外,腾讯云相关产品和产品介绍链接地址与该问题无关,因此不提供相关内容。

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

相关·内容

  • 创建子类对象,父构造函数调用被子类重写方法为什么调用是子类方法?

    static void main(String[] args) { A a = new A(); B b = new B(); } } 问题:为什么创建A对象时候父调用子类方法...但是:创建B对象父调用方法? 答案: 子类被加载到内存方法区后,会继续加载父到内存。...如果,子类重写了父方法,子类方法引用会指向子类方法,否则子类方法引用会指向父方法引用。 如果子类重载了父方法,则子类重载方法引用还指向子类方法。...如果子类方法没有重写也没有重载父方法,则方法引用会指向父方法。 子类对象创建,会先行调用构造方法(构造方法也是方法),虚拟机会在子类方法区寻找该方法并运行。...其结果是编译时候,父构造方法调用方法参数已经强制转换为符合父方法参数了。 上边代码在编译前已经转换为下面这个样子了。

    6.2K10

    Objective-C Runtime编程指南(1)

    这些函数许多函数允许您使用plain C来复制编译Objective-C代码编译器功能。 其他形成了通过NSObject方法导出功能基础。...元素和对象结构如图所示: 一个消息被发送到一个对象,消息传递函数跟随该对象isa指针,指向在调度表查找方法selector结构。...使用隐藏参数 objc_msgSend找到实现一个方法procedure,它会调用该procedure并将消息所有参数传递给该procedure。...这些参数在方法语法是隐藏,但方法被调用函数必须明确。 使用methodForSelector:绕过动态绑定节省了消息传递所需大部分时间。...Objective-C方法只是一个C函数,它至少需要两个参数self和_cmd。 您可以使用函数class_addMethod将函数添加到

    80620

    iOS开发·runtime原理与实践: 消息转发篇(Message Forwarding) (消息机制,方法未实现+API不兼容奔溃,模拟多继承)

    编译器是如何找到这个方法呢?消息发送主要步骤如下: 首先检查这个selector是不是要忽略。比如Mac OS X开发,有了垃圾回收就不会理会retain,release这些函数。...如果上面两步都通过了,就开始查找这个实现IMP,先从cache里查找,如果找到了就运行对应函数去执行相应代码。 如果cache没有找到就找方法列表是否有对应方法。...在编译你写 OC 函数调用语法都会被翻译成一个 C 函数调用 objc_msgSend() 。...例如:我们可以为了避免直接闪退,可以消息没法处理在这个方法给用户一个提示,也不失为一种友好用户体验。 其中,参数invocation是从哪来?...并配置好对应target与selector 配置所需参数:由于每个方法实际是默认自带两个参数:self和_cmd,所以我们要配置其他参数是从第三个参数开始配置 消息转发 3.2.3 验证对比新方案

    2K11

    方法全部都是 static 关键字修饰 ,它构造方法最好作为 private 私有化,理由是方法全是 static, 不知道的人会去new对象去调用需要调用构造方法。 但 static

    方法全部都是 static 关键字修饰 ,它构造方法最好作为 private 私有化,理由是方法全是 static, 不知道的人会去new对象去调用需要调用构造方法。...可以通过调用。     其实它本身也可以通过对象名调用。     推荐使用调用。     静态修饰内容一般我们称其为:与相关成员。...注意事项     a:在静态方法是没有this关键字       如何理解呢?       ...B:内存位置不同     静态变量存储于方法区静态区。     成员变量存储于堆内存。   C:内存出现时间不同     静态变量随着加载而加载,随着消失而消失。     ...static 被jvm调用,不用创建对象,直接名访问。     void 被jvm调用,不需要给jvm返回值。     main 是一个通用名称,虽然不是关键字,但是被jvm识别。

    1.1K20

    runtime那些事(一)——runtime基础介绍

    ---- 三、与 runtime 交互方式 接下来会梳理当 NSObject 与 runtime 交互,runtime 是如何动态加载新以及将消息转发给其它对象。 1....3. runtime 系统提供函数 若要直接使用 runtime 提供函数,必须先引入#import 通过一个最简单例子来看下 Objective-C 代码是如何转化成...在上述最简单Objective-C代码通过 runtime C函数转化后,可以发现: 所有的 Objective-C 方法调用都会在编译转化成C函数 objc_msgSend 调用 objc_msgSend...都封装到此类对象,再通过invoke函数去执行被调用函数,其思想本质是命令者模式展现。...两个没有继承关系一个执行了未能实现方法,可以将该方法转发给另一个可执行该方法去执行,这样就可以灵活弥补 Objective-C 本身不支持多继承特性,也避免因为层层继承导致文件结构臃肿

    1.5K20

    iOS开发-Runtime详解

    头文件存放于/usr/include/objc目录下,这意味着我们使用时只需要引入objc/Runtime.h头文件即可。 许多函数可以让你使用纯 C 代码来实现 Objc 同样功能。...方法隐藏参数 疑问: 我们经常用到关键字 self ,但是 self如何获取当前方法对象呢? 其实,这也是 Runtime 系统作用,self 是在方法运行时被动态传入。...它们在代码被编译被插入方法实现。尽管这些参数没有被明确声明,在源代码我们仍然可以引用它们。 这两个参数self更实用。它是在方法实现访问消息接收者对象实例变量途径。...; i++ ) setter(targetList[i], @selector(setFilled:), YES); 方法被当做函数调用时,两个隐藏参数也必须明确给出,上面的例子调用了1000...虽然可以更高效调用方法,但是这种做法很少用,除非需要持续大量重复调用某个方法情况,才会选择使用以免消息发送泛滥。 ---- 动态方法解析 你可以动态提供一个方法实现。

    73270

    iOS开发-Runtime详解

    头文件存放于/usr/include/objc目录下,这意味着我们使用时只需要引入objc/Runtime.h头文件即可。 许多函数可以让你使用纯 C 代码来实现 Objc 同样功能。...方法隐藏参数 疑问: 我们经常用到关键字 self ,但是 self如何获取当前方法对象呢? 其实,这也是 Runtime 系统作用,self 是在方法运行时被动态传入。...它们在代码被编译被插入方法实现。尽管这些参数没有被明确声明,在源代码我们仍然可以引用它们。 这两个参数self更实用。它是在方法实现访问消息接收者对象实例变量途径。...; i++ ) setter(targetList[i], @selector(setFilled:), YES); 方法被当做函数调用时,两个隐藏参数也必须明确给出,上面的例子调用了1000...虽然可以更高效调用方法,但是这种做法很少用,除非需要持续大量重复调用某个方法情况,才会选择使用以免消息发送泛滥。 ---- 动态方法解析 你可以动态提供一个方法实现。

    72890

    2020-iOS最新面试题解析—1(原理篇)

    return self; } @end 答案:都输出 Son 这个题目主要是考察关于objcself 和 super 理解: * self隐藏参数,指向当前调用方法这个实例。...而 super 本质是一个编译器标示符,和 self 是指向同一个消息接受者 * 使用 self 调用方法,会从当前方法列表开始找,如果没有,就从父再找; * 而使用 super...然后调用这个方法 * 调用[self class] ,会转化成 objc_msgSend函数 ``` id objc_msgSend(id self, SEL op, ......self * 第二个成员是记录当前是什么,告诉程序从父开始找方法,找到方法后,最后内部是使用 objc_msgSend(objc_super->receiver, @selector(class...系统某些block api,UIViewblock版本写动画需要考虑,但也有一些api 需要考虑 以下这些使用方式不会引起循环引用问题 [UIView animateWithDuration

    1.7K21

    self和super区别

    使用 self 调用方法,会从当前方法列表开始找,如果没有,就从父再找;而使用 super ,则从父方法列表开始找,然后调用这个方法。...②使用 self 调用时,会使用 objc_msgSend 函数: id objc_msgSend(id theReceiver, SEL theSelector, ...)。...第 一个参数是消息接收者,第二个参数调用具体方法 selector,后面是 selector 方法可变参数。...以 [self setName:] 为例,编译器会替换成调用 objc_msgSend 函数调用,其中 theReceiver 是 self,theSelector 是 @selector(setName...③使用 super 调用时,会使用 objc_msgSendSuper 函数:id objc_msgSendSuper(struct objc_super *super, SEL op, ...)第一个参数是个

    1.3K110

    iOS运行时Runtime基础

    说明:OC调用方法[receiver selector],编译阶段确定了要向哪个接收者发送message消息,但是接收者如何响应决定于运行时判断。...这其中OC、对象和方法等都对应了C结构体,而且我们都可以在Rutime源码中找到它们定义。 那么,我们如何来查看Runtime代码呢?...为了优化性能,objc_classcache结构体用于记录每次使用或者实例对象调用方法。...利用这个特性,我们可以对代码进行优化:需要大量重复调用方法时候,我们可以绕开消息绑定而直接利用IMP指针调起方法,这样执行将会更加高效,相关代码示例如下: void (*setter)(id,...; for ( i = 0 ; i < 1000 ; i++ ) setter(targetList[i], @selector(setFilled:), YES); 注意:这里需要注意就是函数指针前两个参数必须是

    92430

    Python多路复用 (select、poll 和 epoll)

    也就是说,它变为可读时候,我们需要调用可读应当执行逻辑。...,拿到某一个socket句柄,就知道应该回调哪个函数或者方法,这就是我们建议使用selector原因。...),使用函数是很难实现,因此在实际开发建议使用。...1、回调函数执行不正常该如何?(无法定位异常,排除错误) 2、回调函数里面需要嵌套回调,甚至是多层嵌套,该如何?(多层回调情况很常见) 3、回调函数多层嵌套,其中某个环节出了问题会造成什么后果?...4、如果有某个数据需要被多个,甚至是每个回调函数处理,那该如何操作?5、如何使用当前函数局部变量?

    4.3K30

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

    使用它只是编写和编译OC源代码。 当你编译代码包含OC和方法,编译器创建数据结构和函数调用,实现语言动态特性。数据结构捕获,分类和协议声明信息。...OC需要,这些方法使开发runtime其他接口,生产出增强开发环境工具成为可能。然而,一小些运行时函数只能在编写OC程序时有用。...然后调用程序,通过接收对象(指针指向他数据)为方法传递指定参数。 最后,他返回值时候它传递程序返回值。 提示:编译器对消息传递函数生成调用,在你代码不要直接调用。...使用隐藏参数 objc_msgSend找到一个方法实现程序,它调用这个程序,传递消息所有参数。...同时返回值和参数类型也应该包含在内。 下面的例子展示实现setFilled:方法程序可能是如何调用: ? setFilled 首先两个参数传递给接收对象是self方法选择器是_cmd程序。

    1.6K70

    前端ES6rest剩余参数函数内部如何使用以及遇到问题?

    ES6 引入了 rest 参数(...变量名),用于获取函数内不确定多余参数,注意只能放在所有参数最后一个: function restFunc(...args) { console.log(...arguments 对象区别 剩余参数只包含没有对应形参实参,arguments 包含函数所有实参 剩余参数是一个真正数组,arguments 是一个数组对象,不能直接使用数组方法 arguments...不能在箭头函数使用函数内部怎么使用剩余参数 剩余参数我们大都用在一些公共封装里面,经常配合闭包、call、apply、bind 这些一块使用,对于这几个使用差异很容易把人绕晕。...,但是不是同一个东西,只要记住:...剩余参数是用在定义函数,...展开参数是用在函数调用时(bind 要单独记下)。...3、在闭包函数配合 apply 使用 示例和上面的 call、bind 类似,不过注意 apply 接收参数本来就是一个数组或数组,所以这里并不需要额外用展开运算符去展开剩余参数: function

    14630

    Objective-C Runtime 详解

    SEL objc_msgSend函数第二个参数类型为SEL,它是selector在Objc表示类型(SwiftSelector)。...selector,不缓存,方法返回,否则 转发这个selector,否则 报错,抛出异常 从上面的分析我们可以看到,一个方法在比较“上层”,用比较“下层”(继承关系上上下层)对象去调用时候...如果消息是传递给超,那么会调用名字带有”Super”函数;如果消息返回值是数据结构而不是简单值,那么会调用名字带有”stret”函数。...方法隐藏参数 我们经常在方法中使用 self 关键字来引用实例本身,但从没有想过为什么 self 就能取到调用当前方法对象吧。...其实 self 内容是在方法运行时被偷偷动态传入 objc_msgSend 找到方法对应实现时,它将直接调用该方法实现,并将消息中所有的参数都传递给方法实现,同时,它还将传递两个隐藏参数:

    1.2K20

    Objective-C Runtime详解

    SEL objc_msgSend函数第二个参数类型为SEL,它是selector在Objc表示类型(SwiftSelector)。...selector,不缓存,方法返回,否则 转发这个selector,否则 报错,抛出异常 从上面的分析我们可以看到,一个方法在比较“上层”,用比较“下层”(继承关系上上下层)对象去调用时候...如果消息是传递给超,那么会调用名字带有”Super”函数;如果消息返回值是数据结构而不是简单值,那么会调用名字带有”stret”函数。...方法隐藏参数 我们经常在方法中使用 self 关键字来引用实例本身,但从没有想过为什么 self 就能取到调用当前方法对象吧。...其实 self 内容是在方法运行时被偷偷动态传入 objc_msgSend 找到方法对应实现时,它将直接调用该方法实现,并将消息中所有的参数都传递给方法实现,同时,它还将传递两个隐藏参数:

    1.7K60

    Runtime在iOS开发实际应用

    主要因为方法定义都在objc_class管理,不管如何增删方法,都不影响实例内存布局,创建一个对象必然会分配一块内存区域,包含了isa指针和所有的成员变量。...1.2 相关函数 //为一个实例对象添加一个关联对象,由于是C函数只能使用C字符串,这个key就是关联对象名称,value为具体关联对象值,policy为关联对象策略,与我们自定义属性设置修饰符类似...以至于苹果发邮件禁止使用热修复 整个JSPathIssues被炸锅了。热修复主要做是替换现有的方法,或者增加新方法,需要对消息发送和转发有一定理解。...- (void)viewDidLoad { [super viewDidLoad]; //创建一个函数签名,这个签名可以是任意,但需要注意,签名函数参数数量要和调用一致。...self[index] : nil; } 但是对于老项目 我们难道需要修改所有的容器方法?我们可以使用切面来修改。

    1K20

    iOS runtime探究(二): 从runtime开始深入理解OC消息转发机制你要知道runtime都在这里

    OC消息传递采用动态绑定机制来决定具体调用哪个方法,OC实例方法在转写为C语言后实际就是一个函数,但是OC并不是在编译期决定调用哪个函数,而是在运行期决定,因为编译期根本不能确定最终会调用哪个函数...这也就是消息传递强大之处和弊端,编译期无法检查到未定义方法,运行期可以添加新方法。 讲了这么多OC究竟是怎么将实例方法转换为C语言函数,又是如何调用这些函数呢?...objc_msgSend函数根据消息接受者和selector选择适当方法来调用,那它又是如何选择呢?...:(SEL)name,找不到相关实例方法时候就会调用该类方法去询问是否可以动态添加,如果返回True就会再次执行相关方法,接下来看一下如何给一个动态添加一个方法,那就是调用runtime库class_addMethod...,第二个参数是一个selector,也就是实例方法名字,第三个参数是一个IMP类型变量也就是函数实现,需要传入一个C函数,这个函数至少有两个参数,一个是id self一个是SEL _cmd,第四个参数函数类型

    94370
    领券