我有一段代码,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电话。我是否创建了一个我必须手动释放的中间体或者一些这样的邪恶?
答案 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
tokenizer
和locale
,否则会泄漏。
这属于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),这样可以少考虑一下。