在Objective C中如何在不获取运行时错误的情况下将void*转换为NSString?

use*_*182 1 casting objective-c void-pointers nsstring ios7

关于处理无效*的帖子很多.我已按照他们的指示行事.但是,当尝试将void*转换为NSString*时,我收到运行时错误.

我很确定我错过了一些简单的东西.:-)

请考虑以下代码:

NSString* testString = @"This is a test";
NSLog(@"voidTest = %@", [self voidTest:&testString]);
Run Code Online (Sandbox Code Playgroud)

并具有以下功能:

- (NSString*)voidTest:(void*)testString
{
    NSString* value = (__bridge NSString *)(testString);
    return value;
}
Run Code Online (Sandbox Code Playgroud)

运行此代码时,函数中的第一行会给出以下错误:

Thread 1: EXC_BAD_ACCESS(code=1, address=0x1200000070)
Run Code Online (Sandbox Code Playgroud)

任何有关这方面的帮助将不胜感激.

das*_*ght 5

问题是额外的解引用:你传递一个指针NSString*,它本身就是一个指针.

您可以通过添加额外的解引用来解决此问题 voidTest:

NSString* value = *((__unsafe_unretained NSString **)(testString));
Run Code Online (Sandbox Code Playgroud)

或者通过传递testString代替&testString呼叫者.

这些解决方案都不是理想的,因为它会迫使演员.一般来说,void*应保留用于调用C函数.当将Objective-C调用到Objective-C时,您可以使用id类型,它告诉编译器您正在传递Objective-C对象.

-(void)voidTest:(void*)ptr {
    NSString *val = *((__unsafe_unretained NSString **)(ptr));
    NSLog(@"%@", val);
}

-(void)testVoid {
    NSString *str = @"Hello";
    [self voidTest:&str];
}
Run Code Online (Sandbox Code Playgroud)