在ARC中正确使用CFStringTokenizerCreate?

时间:2012-03-24 13:47:24

标签: ios automatic-ref-counting

我有一段代码,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);

我称之为很多,我怀疑它以某种方式泄漏。那个CFStringTokenizerCreate调用kosher吗?我特别怀疑__bridge电话。我是否创建了一个我必须手动释放的中间体或者一些这样的邪恶?

4 个答案:

答案 0 :(得分:1)

完成使用标记生成器后,您需要调用CFRelease(tokenizer);。见Ownership Policy。你也应该致电CFRelease(locale);

您的__bridge sentence语法正确无误。我必须说Xcode在大多数情况下对__bridge__bridge_transfer都是正确的。在您的情况下,您传递的是NSObject的引用以供CF使用。您无意将所有权转移到CF,因为您认为ARC非常擅长管理NSObject。因此,当CFStringTokenizerCreate使用sentence完成时,它不会做任何事情来释放它。然后,ARC将释放sentence

另一方面,如果您将其更改为__bridge_transfer,则表示您正在将所有权转移到CF.因此,当您完成后,ARC将不会释放sentence。您必须致电CFRelease(sentence);将其释放,这不是理想的行为。

答案 1 :(得分:1)

您需要CFRelease tokenizerlocale,否则会泄漏。

这属于Core Foundation Ownership Policy,与ARC无关。

__bridge演员告诉ARC,sentence电话中的CFStringTokenizerCreate没有进行所有权转移。那就好了。

您可以使用Xcode的静态分析器和分析器测试内存泄漏。

答案 2 :(得分:0)

我的直觉告诉我它应该是__bridge_transfer而不是bridge,因为你正在调用create(除非之后有CFRelease调用)。我也认为需要发布语言环境,因为它是一个副本。

编辑哎呀忽略我,我读错了(正在使用手机)

答案 3 :(得分:0)

对于任何读取此线程的Swift用户: <script src="js/jquery-1.11.1.min.js"></script> <script src="bootstrap-3.3.7-dist/js/bootstrap.min.js"></script> <script src="http://ajax.aspnetcdn.com/ajax/jquery.validate/1.15.0/jquery.validate.js"></script> <script src="js/snip.js"></script> <script src="js/action.js"></script> <script> $('#reg_form').validate({ rules:{ FirstName:{ required:true }, Email:{ required:true, email:true }, ConfirmEmail:{ required:true, email:true, equalTo:"#Email" }, code:{ number:true }, Mobile:{ number:true } }, messages:{ FirstName:{ required:"Please enter your First Name" }, Email:{ required:"Please provide an Email address", }, ConfirmEmail:{ required:"Please provide an Email address", equalTo:"Please provide same Email address" } } }); $('button').on('click',function(){ if($('#reg_form').valid()==true) $(this).stop(); }); </script> 函数似乎没有进入Swift语言,因为Core Foundation对象是自动内存管理的(根据我看到的编译器警告) Swift 3.0.2),这样可以少考虑一下。