iphone - 如何正确地使 NSTimer 失效

标签 iphone objective-c nstimer invalidation

我有一个带有 NSTimer 的 iPhone 应用程序,名为 pressTimer,每当有人触摸此按钮时,该应用程序就会关闭。问题是他们经常触摸按钮,我希望计时器在他们抬起手指时停止。因此,我在 .h 中声明了 pressTimer 并在 .m 中合成了它,然后分配并在我创建的 TouchDown 操作上启动它。我在 TouchUpInside 操作上使用代码 [pressTimer invalidate] 来取消计时器,因为它是一个全局变量。它似乎可以很好地取消计时器,但是当我实际触发计时器时,程序完全卡住,即使我没有收到代码错误或警告。我是菜鸟,所以请不要太粗暴:0

更新:控制台日志 - 谢谢大家!

continue
2010-07-01 16:39:30.981 Clickkr[1573:307] -[__NSCFData invalidate]: unrecognized selector sent to instance 0x154b40
2010-07-01 16:39:30.999 Clickkr[1573:307] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFData invalidate]: unrecognized selector sent to instance 0x154b40'
*** Call stack at first throw:
(
    0   CoreFoundation                      0x309a5fd3 __exceptionPreprocess + 114
    1   libobjc.A.dylib                     0x318b58a5 objc_exception_throw + 24
    2   CoreFoundation                      0x309a9a77 -[NSObject(NSObject) doesNotRecognizeSelector:] + 102
    3   CoreFoundation                      0x309a8f15 ___forwarding___ + 508
    4   CoreFoundation                      0x3093b680 _CF_forwarding_prep_0 + 48
    5   Clickkr                             0x00002b23 -[MyViewController addOne:] + 42
    6   CoreFoundation                      0x309307ad -[NSObject(NSObject) performSelector:withObject:withObject:] + 24
    7   UIKit                               0x31e1f829 -[UIApplication sendAction:to:from:forEvent:] + 84
    8   UIKit                               0x31e1f7c9 -[UIApplication sendAction:toTarget:fromSender:forEvent:] + 32
    9   UIKit                               0x31e1f79b -[UIControl sendAction:to:forEvent:] + 38
    10  UIKit                               0x31e1f4ed -[UIControl(Internal) _sendActionsForEvents:withEvent:] + 356
    11  UIKit                               0x31e1fb3b -[UIControl touchesEnded:withEvent:] + 342
    12  UIKit                               0x31e1e4ed -[UIWindow _sendTouchesForEvent:] + 368
    13  UIKit                               0x31e1de67 -[UIWindow sendEvent:] + 262
    14  UIKit                               0x31e19b5b -[UIApplication sendEvent:] + 298
    15  UIKit                               0x31e19507 _UIApplicationHandleEvent + 5022
    16  GraphicsServices                    0x30a8c147 PurpleEventCallback + 666
    17  CoreFoundation                      0x3097baab __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ + 26
    18  CoreFoundation                      0x3097d84f __CFRunLoopDoSource1 + 166
    19  CoreFoundation                      0x3097e62d __CFRunLoopRun + 520
    20  CoreFoundation                      0x309278eb CFRunLoopRunSpecific + 230
    21  CoreFoundation                      0x309277f3 CFRunLoopRunInMode + 58
    22  GraphicsServices                    0x30a8b6ef GSEventRunModal + 114
    23  GraphicsServices                    0x30a8b79b GSEventRun + 62
    24  UIKit                               0x31dc32a7 -[UIApplication _run] + 402
    25  UIKit                               0x31dc1e17 UIApplicationMain + 670
    26  Clickkr                             0x00002333 main + 70
    27  Clickkr                             0x000022e8 start + 40
)
terminate called after throwing an instance of 'NSException'
Program received signal:  “SIGABRT”.

最佳答案

这是我使计时器无效的方法:

[timer invalidate];
timer = nil;

您可能遇到的问题是,一旦计时器无效,它就会从运行时循环中删除,当有人想要访问它时,您的程序就会崩溃。使其无效后,使其为零即可。这样,如果有人想发送消息或对其执行任何操作,它会将其发送为零。

关于iphone - 如何正确地使 NSTimer 失效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3161303/

相关文章:

ios - 将 mac 升级到 OSx Yosemite 后 SCplugin 停止工作

iphone - 为什么 XCode 存档与 XCode 在 iPhone 上构建/运行不同

ios - Swift 自动运行 NSTimer

ios - 如何追踪启动过程中哪个操作是低端的?

ios - 如何使用openCV检测实时摄像机中的移动物体

iphone - 向 UILabel 添加背景图像

ios - 加载 SDWebImage 图像大小大于 imageview 的图像

objective-c - cocoa /ObjC : Are there any performance drawbacks to my style of allocing objects for property iVars?

objective-c - Cocoa 输入事件对于 NSTimer 来说是线程安全的吗

xcode - Sigabrt swift Xcode(制作计时器)