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

如何修复NSTimer中“向'SEL _Nonnull‘类型的参数发送'void (void)’的不兼容指针类型”

这个问题涉及到Objective-C中的NSTimer类,它用于在指定的时间间隔后执行代码。错误信息“向'SEL _Nonnull‘类型的参数发送'void (void)’的不兼容指针类型”通常是因为在创建NSTimer时传递了一个不正确的方法签名。

基础概念

NSTimer是Objective-C中的一个类,用于安排在未来的某个时间点或按照一定的时间间隔执行某个方法。创建NSTimer时,需要指定要调用的方法,这个方法的签名必须符合特定的格式。

相关优势

  • 定时执行:可以设置定时器在特定时间后执行一次或在固定时间间隔内重复执行。
  • 灵活性:可以轻松地启动、暂停或停止定时器。

类型

  • 一次性定时器:在指定的时间后执行一次。
  • 重复定时器:按照固定的时间间隔重复执行。

应用场景

  • 动画效果:用于创建平滑的动画效果。
  • 后台任务:定期检查数据更新或执行后台维护任务。
  • 提醒通知:设置定时提醒或通知。

问题原因

错误信息表明传递给NSTimer的方法签名不正确。NSTimer期望的方法应该有两个参数:一个是NSTimer本身,另一个是id类型的参数(通常是self)。方法签名应该是这样的:

代码语言:txt
复制
- (void)methodName:(NSTimer *)timer;

解决方法

要修复这个问题,需要确保传递给NSTimer的方法具有正确的签名。以下是一个正确的示例:

代码语言:txt
复制
// 正确的方法签名
- (void)updateTimer:(NSTimer *)timer {
    // 定时器触发时要执行的代码
}

// 创建定时器的代码
NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:1.0
                                                  target:self
                                                selector:@selector(updateTimer:)
                                                userInfo:nil
                                                 repeats:YES];

在这个例子中,updateTimer:方法的签名是正确的,它接受一个NSTimer参数。这样,NSTimer就能够正确地调用这个方法,而不会出现类型不兼容的错误。

总结

确保NSTimer调用的方法具有正确的签名是解决这个问题的关键。方法应该接受一个NSTimer参数,并且没有返回值。通过检查和修正方法签名,可以避免这类错误,并确保定时器能够按预期工作。

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

相关·内容

iOS APP运行时Crash自动修复系统

: 这个方法,所以向testObj发送someMethod:这个方法的时候,将会导致该方法无法在相关的方法列表里找到,最终导致app的crash。...:(SEL)sel; //后两个方法需要转发到其他的类处理 - (id)forwardingTargetForSelector:(SEL)aSelector; - (void)forwardInvocation...3.4 NSTimer类型crash防护(NSTimer) 3.4.1 NSTimer crash 产生原因 在程序开发过程中,大家会经常使用定时任务,但使用NSTimer的 scheduledTimerWithTimeInterval...3.7 野指针类型crash防护(Bad Access) 3.7.1 野指针crash 产生原因 在App的所有Crash中,访问野指针导致的Crash占了很大一部分,野指针类型crash的表现为:Exception...实例的全部方法拦截机制 和 消息转发机制,那么就可以做到在野指针访问时不Crash而只是crash时相关的信息。

3.4K1713

iOS 如何解决 NSTimer 循环引用

在 ViewController 执行 dealloc 前释放 timer(不推荐) ---- 可以在 viewWillAppear 中创建 timer 可以在 viewWillDisappear 中销毁...,NSTimer 强引用 PFTimer,避免让NSTimer 强引用 ViewController,这样就不会引起循环引用,然后在 dealloc 方法中执行 NSTimer 的销毁,相对的 PFTimer...使用很简单,但是要注意两点: 避免 block 的循环引用,使用 __weak 和 __strong 来避免 在持用 NSTimer 对象的类的方法中 -(void)dealloc 调用 NSTimer...在 NSTimer+PFSafeTimer.m 中的代码如下: #import "NSTimer+PFSafeTimer.h" @implementation NSTimer (PFSafeTimer...)sel { return [self.object methodSignatureForSelector:sel]; } @end 在使用的时候如下代码: #import "ViewController1

1.5K30
  • iOS运行时Runtime基础

    说明:OC调用方法[receiver selector],编译阶段确定了要向哪个接收者发送message消息,但是接收者如何响应决定于运行时的判断。...Objective-C在编译时,会依据每一个方法的名字、参数序列,生成一个唯一的整型标识(Int类型的地址),这个标识就是SEL。 注意: 1.不同类中相同名字的方法对应的方法选择器是相同的。...: method_name:方法名类型SEL method_types: 一个char指针,指向存储方法的参数类型和返回值类型 method_imp:本质上是一个指针,指向方法的实现 这里其实就是...(IMP)(void / id, SEL, ... */ ); IMP这个函数指针指向了方法实现的首地址,当OC发起消息后,最终执行的代码是由IMP指针决定的。...@param name selector方法名 @param imp 指向实现方法的函数指针 @param types imp函数实现的返回值与参数类型 @return 添加方法是否成功 *

    93430

    iOS常见的内存问题——循环引用

    全局的 Block 比较简单,凡是没有引用到 Block 作用域外面的参数的 Block 都会放到全局内存块中,在全局内存块的 Block 不用考虑内存管理问题。...的引用,则会有一个强引用的指针指向 self,就会发生循环引用,如果采用 weakSelf,内部不会有强类型的指针,所以可以解决循环引用问题。...内部都会重新生成一个新的指针指向 self,这是一个强引用的指针,结果就会导致循环引用。...因为他也是 Foundation 框架中的基类, 通常用来实现消息转发, 我们可以用它来包装 NSTimer 的 target, 达到弱引用的效果。...名,参数和返回值类型,最重要的是有所有参数值,可以从这个 NSInvocation 对象里拿到调用的所有参数值。

    1.8K10

    iOS开发·runtime原理与实践: 基本知识篇(类,超类,元类,super_class,isa,对象,方法,SEL,IMP)

    另外我们常见的id类型,它是一个objc_object结构类型的指针。该类型的对象可以转换为任何一种对象,类似于C语言中void *指针类型的作用。...当向对象发消息,runtime会在这个对象所属类方法列表中查找发送消息对应的方法,但当向类发送消息时,runtime就会在这个类的meta class方法列表里查找。...SEL 方法类型 method_types 是个 char 指针,存储方法的参数类型和返回值类型 method_imp 指向了方法的实现,本质是一个函数指针 简言之,Method = SEL + IMP...(*IMP)(id _Nonnull, SEL _Nonnull, ...); #endif 实际上就是一个函数指针,指向方法实现的首地址。...void *类型的参数。

    1.7K40

    iOS 开发:『Crash 防护系统』(一)Unrecognized Selector

    在这个过程中, 说不定会因为崩溃而导致关键业务中断、用户存留率下降、品牌口碑变差、生命周期价值下降等,最终导致流失用户,影响到公司的发展。 当然,避免崩溃问题的最好办法就是不产生崩溃。...,在各个分类的 +(void)load; 中通过 Method Swizzling 拦截容易造成崩溃的系统方法,将系统原有方法与添加的防护方法的 selector(方法选择器) 与 IMP(函数实现指针...然后在替换方法中添加防护操作,从而达到避免以及修复崩溃的目的。...所以向 testButoon 对象发送 someMethod: 方法,就会导致 testButoon 对象无法找到对应的方法实现,最终导致 APP 的崩溃。...消息重定向:Runtime 系统利用 methodSignatureForSelector: 方法获取函数的参数和返回值类型。

    2.1K30

    iOS_定时器:NSTimer、GCDTimer、DisplayLink

    文章目录 一、NSTimer 1. 工作原理 2. 初始化方法的区别 3. 8种初始化方法: 4. 不work的原因 5. 循环引用 6....初始化方法的区别 NSTimer的初始化方法中只有scheduled开头的,会自动把Timer添加到当前的RunLoop的DefaultMode里。...的3大缺陷:RunLoop、Thread、Leaks 因为NSTimer依赖RunLoop实现的,所以: 1.默认在RunLoop的DefaultMode下计时 (导致scrollView滑动不work...) 2.RunLoop对NSTimer保持强引用 (容易导致内存泄露问题) 3.子线程中默认不创建RunLoop,导致NSTimer失效 4.NSTimer的创建和撤销必须在同一个线程操作,不能跨线程操作...一样:依赖RunLoop,会对target造成强引用 解决的办法也可以跟NStimer一样 四、对比总结 以上说了iOS的3中计时器,各有优缺点: NSTimer:适用于各种计时/循环处理的事件,频率计算可以按秒计

    87320

    关于runtime

    当程序执行[object doSomething]时,会向消息接收者(object)发送一条消息(doSomething),runtime会根据消息接收者是否能响应消息而做出不同的反应。...runtime的执行流程: 首先,通过object的isa指针找到它的 class ; 在 class 的 method list 找 doSomething ; 如果 class 中没到 doSomething...指向一个方法实现的指针 typedef id (*IMP)(id, SEL, ...); #endif 在iOS的Runtime中,Method通过selector和IMP两个属性,实现了快速查询方法及实现...class] SEL name: 将要添加的方法名,传的类型 @selector(方法名) IMP imp:实现这个方法的函数 ,传的类型 1,C语言写法:(IMP)方法名 2,OC的写法..."v@:":v:是添加方法无返回值 @表示是id(也就是要添加的类) :表示添加的方法类型 @表示:参数类型 2.备用接收者 如果动态解析返回为NO,则执行forwardingTargetForSelector

    59610

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

    ),苹果系统迭代造成API不兼容的奔溃处理,第四节将总结消息转发的机制。...示例:向0x12345678对象发送meaning并且没有参数。 选择器:表示消息或方法名称的一种特殊方式,表示为类型SEL。...objc_msgSend(id _Nullable self, SEL _Nonnull op, ...)` 1.2 消息发送的主要步骤 消息发送的时候,在C语言函数中发生了什么事情?...换句话说,无论何时发送未知消息,它​​都会以一个很好的包发送到您的代码中,此时您可以随心所欲地执行任何操作。 1.3 OC的方法本质 OC中的方法默认被隐藏了两个参数:self和_cmd。...@代表self的类型id,第三个字符:代表_cmd的类型SEL。

    2.1K11

    iOS开发·RunLoop源码与用法完全解析(输入源,定时源,观察者,线程间通信,端口间通信,NSPort,NSMessagePort,NSMachPort,NSPortMessage)

    你只能在一个线程的内部获取其 RunLoop(主线程除外)。 ? Demo中如何查看线程栈 5....selector也是特殊的基于自定义的源.理论上来说,允许在当前线程向任何线程上执行发送消息,和基于端口的源一样,执行selector请求会在目标线程上序列化,减缓许多在线程上允许多个方法容易引起的同步问题...中(如果当前线程没runloop则方法无效;performSelector:onThread: 方法放到指定线程runloop中) - (void)performSelector:(SEL)aSelector...完成向主线程port发送消息 [self sendPortMessage]; } } 当使用 NSMachPort 的时候,本地和远程线程可以使用相同的端口对象在线程间进行单边通信...可是添加到子线程中的NSDefaultRunLoopMode里,无论如何滚动,timer都能够很正常的运转。这又是为啥呢?

    2.5K20

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

    每一个对象内部都有一个isa指针,这个指针是指向它的真实类型 根据这个指针就能知道将来调用哪个类的方法 下面的代码输出什么?...在向一个对象发送消息时,runtime库会根据对象的isa指针找到该对象实际所属的类 然后在该类中的方法列表以及其父类方法列表中寻找方法运行 如果,在最顶层的父类(一般也就NSObject)中依然找不到相应的方法时...在Objective-C中向nil发送消息是完全有效的——只是在运行时不会有任何作用 如果一个方法返回值是一个对象,那么发送给nil的消息将返回0(nil) 如果方法返回值为指针类型,其指针大小为小于或者等于...如果向一个nil对象发送消息,首先在寻找对象的isa指针时就是0地址返回了,所以不会出现任何错误 objc中向一个对象发送消息obj foo和objc_msgSend()函数之间有什么关系?...* 首先它会发送-methodSignatureForSelector:消息获得函数的参数和返回值类型。

    1.7K21

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

    方法一定会有两个参数:消息接收者、消息方法名称 runtime 的核心是消息机制,其执行过程大致可分为三个部分:消息发送、动态方法解析、消息转发 编译阶段: 以上全都为不带参数的方法编译后的C函数结构...最终通过runtime中的class_addMethod(Class _Nullable cls, SEL _Nonnull name, IMP _Nonnull imp, const char * _.../** 运行时方法:向指定类中添加特定方法实现的操作 @param cls 被添加方法的类 @param name selector方法名 @param imp 指向实现方法的函数指针 @param...关于types参数,即 IMP 函数实现的返回值与参数类型,可以参考官方说明文档Objective-C Runtime Programming Guide 在动态解析方法过程中 对象方法 执行的顺序为...通过下面这张图可以更好地理解 isa指针在类中向上传递查找顺序,也正好佐证了上述类方法在动态解析过程为什么执行了两次。 ? isa指针查找顺序图 2.

    1.6K20

    NSTimer类的使用

    userInfo:(id)userInfo   repeats:(BOOL)yesOrNo; 创建返回一个新的NSTimer对象和时间表,在当前的默认模式下循环调用一个实例方法。...表示输入一个时间间隔对象,以秒为单位,一个>0的浮点类型的值,如果该值<0,系统会默认为0.1  target:(id)aTarget 表示发送的对象,如self  selector:(SEL)aSelector...方法选择器,在时间间隔内,选择调用一个实例方法 userInfo:(id)userInfo 此参数可以为nil,当定时器失效时,由你指定的对象保留和释放该定时器。...repeats:(BOOL)yesOrNo 当YES时,定时器会不断循环直至失效或被释放,当NO时,定时器会循环发送一次就失效。...userInfo:nil                                                                 repeats:NO]; } //触发事件 -(void

    73290
    领券