2016-07-29 29 views
0

我有下面的代碼片段:的NSString *到CFStringRef導致無用的字符數組

-(CFStringRef)setupFileName:(NSString*)_name :(NSString*)_extension 
{ 
NSString* tmpName = [_name stringByAppendingString:_extension]; 
CFStringRef ref = (__bridge CFStringRef)tmpName; 
return ref; 
} 

當我在return語句打破,裁判包含正確的數據,一個不錯的字符串擴展。 但是當我使用它是這樣的:

CFStringRef tickWav = [self setupFileName:_name :kTick]; 

這導致無用的文字鏈。 當我從函數返回正確的值時,是否有東西會破壞我的編碼?我能做什麼?

+0

與你沒有關係的問題,但是......我強烈建議用所有參數命名你的方法:' - (CFStringRef)setupFileName:(NSString *)_ name withExtension:(NSString *)_ extension'並且也避免'_'爲那種變種。另外,爲什麼在向括號之間的'tmpName'賦值時調用'stringByAppendingString:'? – Larme

+0

它是在括號中,因爲轉換爲CFStringRef之前發生它們..你知道我的問題的解決方案嗎? – bob

回答

1

沒有自動的CFTypeRef內存管理。如果你要返回一個NSString,它將被自動釋放。對於CFStringRef不是這樣。所以你必須自己做這項工作。

您需要使用CFRetain保留CFStringRef並執行__bridge_retained強制轉換,而不是__bridge強制轉換。你從目標世界跨越到CFTypeRef世界的橋樑;您必須在該字符串跨越橋時提供內存管理。之後您需要在接收代碼中手動釋放CFStringRef,否則會泄漏。

+0

但總的來說,我會問你爲什麼要過橋。難道你寧願在這裏返回一個NSString? – matt

+0

因爲我需要一個CFStringRef ...但是,嘿,__bridge_retained解決了我的問題,非常感謝。我需要調查更多關於此主題的信息 – bob

+0

可能要閱讀我的書:http://www.apeth.com/iOSBook/ch12.html#_memory_management_of_cftyperefs – matt

相關問題