如何从 int* 转换为 NSNumber*



我有以下代码。它编译,但崩溃。 我做错了什么?

- (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 .例如,如果您有延迟呼叫,但希望该呼叫具有最新值,则可能需要这样做。注意 为了简单起见,我在这里忽略了同步方面

当你使用它时,你应该清理数据类型的使用,并使用boolBOOL来保持你的标志。

- (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的指针。通常情况下,最好保持简单。

最新更新