0

次のコード スニペットがあります。

-(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];

その結果、無用な文字チェーンが作成されます。関数から正しい値を返すときに、エンコードが壊れているものはありますか?? 私に何ができる?

4

1 に答える 1

1

自動 CFTypeRef メモリ管理はありません。NSString を返すと、自動解放されます。CFStringRef の場合はそうではありません。そのため、自分で作業を行う必要があります。

CFRetain で CFStringRef を保持し、__bridge_retainedキャストではなくキャストを実行する必要があり__bridgeます。オブジェクトの世界から CFTypeRef の世界への橋を渡っています。この文字列がブリッジを通過するときに、この文字列にメモリ管理を提供する必要があります。その後、後で受信コードで CFStringRef を手動で解放する必要があります。そうしないと、リークが発生します。

于 2016-07-29T15:36:54.980 に答える