2012-03-24 11 views
0

...ARCでCFStringTokenizerCreateを適切に使用しますか?私はARCコンバータは、このになってコードの部分を持っている

// firstRange is a NSRange obviously 
// test is an NSString * passed in as parameter to the method 
NSRange range = NSMakeRange(firstRange.location, (lastRange.location - firstRange.location) + lastRange.length); 
NSString *sentence = [text substringWithRange:range]; 
// OK, now chop it up with the better parser 
CFRange allTextRange = CFRangeMake(0, [sentence length]); 
CFLocaleRef locale = CFLocaleCopyCurrent(); 
CFStringTokenizerRef tokenizer = CFStringTokenizerCreate(kCFAllocatorDefault, 
    (__bridge CFStringRef) sentence, 
    allTextRange, 
    kCFStringTokenizerUnitWord, 
    locale); 

私はLOTこれを呼び出すと、私はそれが何らかの形で漏れたと思われます。 CFStringTokenizerCreateコールコーシャーですか?私は特に__bridge呼び出しを疑っています。手動でリリースしなければならない中間体やそのような悪意を作成しますか?

答えて

1

CFReleasetokenizerlocaleが必要です。そうしないと、リークします。

これはCore Foundation Ownership Policyに該当し、ARCとは関係ありません。

__bridgeキャストは、の所有権移転がCFStringTokenizerCreateコールで行われていないことをARCに伝えます。だからそれはOkです。

Xcodeのスタティックアナライザとプロファイラを使用してメモリリークをテストできます。

+0

ええと、私はそうすることが判明しますが、あなたのポイントはまだ有効です。答えてくれてありがとう。 –

0

私のガットは、ブリッジの代わりにブリッジの代わりに__bridge_transferする必要があります(後でCFReleaseコールがない限り)。ロケールはコピーであるため、リリースする必要があるとも思います。

はEDITおっと私を無視、私はそれが間違っているあなたは、あなたがトークナイザを使用して行われたときにCFRelease(tokenizer);を呼び出す必要があり

1

(電話を使用していた)をお読みください。 Ownership Policyを参照してください。 CFRelease(locale);にも電話する必要があります。

__bridge sentenceの構文は正しいです。 Xcodeはほとんどの場合、__bridge__bridge_transferについて正しいと言わなければなりません。あなたの場合は、CFで使用するためのNSObjectの参照を渡しています。 NSObjectを管理する上でARCが優れていると思うので、所有権をCFに移すつもりはありません。したがってがsentenceを使用して完了すると、それを解放するための何もしません。 ARCはsentenceを解放します。

一方、__bridge_transferに変更した場合は、所有権をCFに転送することをARCに伝えます。したがって、完了すると、ARCはsentenceを解放しません。 CFRelease(sentence);に電話をして解放する必要があります。これは望ましい動作ではありません。

+0

私は上記の同じミスをしましたが、それは実際には後方です。 __bridge_transferは所有権をARCオブジェクトに転送し、__bridge_retainedは所有権をCFオブジェクトに転送します。 – borrrden

0

CFRelease()機能はSwift言語に組み込まれているようには見えません.Core Foundationオブジェクトは自動的にメモリ管理されます(Swift 3.0のコンパイラ警告によると)。 2)、それは考えることが少ないことです。

関連する問題