NSString* 到 CFStringRef 导致无用的字符数组
NSString* to CFStringRef results in useless char array
我有以下代码片段:
-(CFStringRef)setupFileName:(NSString*)_name :(NSString*)_extension
{
NSString* tmpName = [_name stringByAppendingString:_extension];
CFStringRef ref = (__bridge CFStringRef)tmpName;
return ref;
}
当我在 return 语句中断时,ref 包含正确的数据,一个带扩展名的漂亮字符串。
但是当我这样使用它时:
CFStringRef tickWav = [self setupFileName:_name :kTick];
它会导致无用的字符链。
当我 return 从函数中得到正确的值时,是否有什么东西破坏了我的编码?我能做什么?
没有自动 CFTypeRef 内存管理。如果你要 return 一个 NSString,它会被自动释放。对于 CFStringRef 不是这样。所以你必须自己完成工作。
您需要使用 CFRetain 保留 CFStringRef 并进行 __bridge_retained
转换,而不是 __bridge
转换。您正在跨越从对象世界到 CFTypeRef 世界的桥梁;您必须在该字符串通过桥接器时对其进行内存管理。然后您需要稍后在接收代码中手动释放 CFStringRef,否则它会泄漏。
我有以下代码片段:
-(CFStringRef)setupFileName:(NSString*)_name :(NSString*)_extension
{
NSString* tmpName = [_name stringByAppendingString:_extension];
CFStringRef ref = (__bridge CFStringRef)tmpName;
return ref;
}
当我在 return 语句中断时,ref 包含正确的数据,一个带扩展名的漂亮字符串。 但是当我这样使用它时:
CFStringRef tickWav = [self setupFileName:_name :kTick];
它会导致无用的字符链。 当我 return 从函数中得到正确的值时,是否有什么东西破坏了我的编码?我能做什么?
没有自动 CFTypeRef 内存管理。如果你要 return 一个 NSString,它会被自动释放。对于 CFStringRef 不是这样。所以你必须自己完成工作。
您需要使用 CFRetain 保留 CFStringRef 并进行 __bridge_retained
转换,而不是 __bridge
转换。您正在跨越从对象世界到 CFTypeRef 世界的桥梁;您必须在该字符串通过桥接器时对其进行内存管理。然后您需要稍后在接收代码中手动释放 CFStringRef,否则它会泄漏。