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)
任何有关这方面的帮助将不胜感激.
问题是额外的解引用:你传递一个指针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)