我有以下代码。它编译,但崩溃。 我做错了什么?
- (void)start: (int*)shouldPause
{
NSNumber * oShouldPause = (NSNumber *)shouldPause;
[self performSelectorInBackground:@selector(runThread:) withObject: oShouldPause];
}
和函数运行线程是
- (void)runThread: (NSNumber*) shouldPause
通常,我想在线程外部和线程内部设置一些整数,以根据此整数更改行为。
感谢您的帮助!
NSNumber * oShouldPause = @(*shouldPause);
你所做的是一个常见的错误。 NSNumber
是一个对象,而int
是一个基元类型。将指向基元类型的指针强制转换为指向对象的指针。编译器允许这样做,因为它们都只是指针。此外,代码需要一个对象,试图发送消息和繁荣。出了点问题。
很可能您不需要int*
作为参数。只是int
.因此,您需要按如下方式创建数字对象,而无需取消引用:
NSNumber * oShouldPause = @(shouldPause);
正如安德烈·切穆卡已经引用的那样,你不能对NSNumber *
投int *
。
另一个可行的选择,如果你真的需要传递指针而不是指针的内容(这是 Andrey 提供的代码(是使用 NSValue
.例如,如果您有延迟呼叫,但希望该呼叫具有最新值,则可能需要这样做。注意 为了简单起见,我在这里忽略了同步方面。
当你使用它时,你应该清理数据类型的使用,并使用bool
或BOOL
来保持你的标志。
- (void)start:(BOOL *)shouldPause {
NSValue *oShouldPause = [NSValue valueWithPointer:shouldPause];
[self performSelectorInBackground:@selector(runThread:) withObject:oShouldPause];
}
- (void)runThread:(NSValue *)value {
BOOL *shouldPause = (BOOL *) [value pointerValue];
if (shouldPause) {
// Pause-a-licous
NSLog(@"shouldPause is %d", *shouldPause);
}
}
请注意,这有警告!!这意味着,您需要保证指针的生命周期,否则您将有一个悬空指针。所以这样做不适合温顺的人。
需要明确的是,根据你的问题,我认为安德烈的回答是正确的做法。我只是将其添加为您的工具箱的另一个选项。
此外,考虑到您做事的方式,您甚至不需要使用 performSelector:withObject:
.
- (void)startAlternate:(BOOL *)shouldPause {
[self runThreadAlternate:shouldPause ? *shouldPause : NO];
}
- (void)runThreadAlternate:(BOOL)shouldPause {
// Pause-o-matic
NSLog(@"shouldPause is %d", shouldPause);
}
我甚至可能会将参数更改为startAlternate:
BOOL
而不是指向BOOL
的指针。通常情况下,最好保持简单。