gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 16:23:15 25 4
gpt4 key购买 nike

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

- (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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com