objective-c - 使用 NSTimer 传递原始参数的正确方法

标签 objective-c cocoa cocoa-touch nstimer

我正在使用一个调用此方法的基本计时器:

- (void) refresh:(id)obj
{
    if (obj == YES) doSomething;
}

我想从代码的某些区域以及计时器调用此方法

[NSTimer scheduledTimerWithTimeInterval:refreshInterval
                            target:self
                            selector:@selector(refresh:) 
                            userInfo:nil 
                            repeats:YES];

当我将 YES 作为 userInfo 参数的参数时,我收到 EXC_BAD_ACCESS 错误;这是为什么?

有人可以帮助我以正确的方式做到这一点,这样就不会出现难看的选角之类的情况吗?

最佳答案

userInfo 参数必须是一个对象;它的类型是idYES 是一个原语,即值1。为了确保 userInfo 对象不会被释放,计时器会保留它。因此,当您传递 YES 时,NSTimer 正在执行 [(id)YES keep]。在您自己的代码中尝试一下,看看会发生什么。 :-P

作为Documentation声明,您为方法提供的选择器必须具有签名

- (void)timerFireMethod:(NSTimer*)theTimer

这意味着你不能让 NSTimer 调用任何方法——至少不能直接调用。您可以使用上述签名创建一个特殊方法,该方法反过来会调用您想要的任何方法。

所以,假设您有一个名为 refresh: 的方法,并且您希望经常调用它,并传递 YES。你可以这样做:

// somewhere
{
    [NSTimer scheduledTimerWithTimeInterval:refreshInterval
                                     target:self
                                   selector:@selector(invokeRefresh:)
                                   userInfo:nil
                                    repeats:YES];
}

- (void)invokeRefresh:(NSTimer *)timer {
    [self refresh:YES];
}

- (void)refresh:(BOOL)flag {
    if (flag) {
        // do something
    }
}

关于objective-c - 使用 NSTimer 传递原始参数的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3262268/

相关文章:

ios - MKMapView 未在 mapType MKMapTypeStandard 和 MKMapTypeHybrid 上加载

objective-c - 在 Cocos2d 中删除 Sprite 导致崩溃

objective-c - NSPredicate 和简单的正则表达式问题

iOS 10,应用程序在前台时显示本地通知?

iphone - 你能确定插入iphone/ipad/ipod耳机插孔的具体设备类型吗?

cocoa - 如何让ViewController成为第一响应者?

objective-c - 在 NSMutableArray 中查找重复的对象属性

ios - 根据 textView 调整单元格大小不起作用?

ios - Xcode 不在表格单元格上使用 NSMutableArray

iphone - UIScrollView 和内容需要触摸移动事件