有人可以帮我转换下面的代码以支持ARC吗?
UIFont *boldFont = [UIFont fontWithName:@"DINPro-Medium" size:14];
CTFontRef ctBoldFont = CTFontCreateWithName((__bridge CFStringRef)boldFont.fontName, boldFont.pointSize, NULL);
CGColorRef cgColor = UIColorFromRGB(0x2b776d).CGColor;
NSNumber* underline = [NSNumber numberWithInt:kCTUnderlineStyleSingle];
NSDictionary *ULSubattributes = [NSDictionary dictionaryWithObjectsAndKeys:
CFBridgingRelease(ctBoldFont), (id)(id)kCTFontAttributeName,
cgColor, (id)kCTForegroundColorAttributeName,underline, (NSString*)kCTUnderlineStyleAttributeName, nil];
我在最后一行遇到了崩溃,
*** -[Not A Type retain]: message sent to deallocated instance 0x20ad4910
*** -[Not A Type class]: message sent to deallocated instance 0x20ad4910
我希望这是一个重复的问题。但我被卡住了。感谢。
答案 0 :(得分:3)
以下是我的一些实际工作代码,它与您的代码非常相似:
CTFontRef font2 =
CTFontCreateCopyWithSymbolicTraits (
basefont, f, nil, kCTFontBoldTrait, kCTFontBoldTrait);
NSDictionary* d2 =
@{(NSString*)kCTFontAttributeName: CFBridgingRelease(font2)};
[mas addAttributes:d2 range:encRange];
请注意,我不发布font2
! CFBridgingRelease
表示“ARC,此对象已被保留; 您在时机成熟时将其释放。”和ARC一样。没有泄漏,没有僵尸,没有崩溃,没有问题。
(另一方面,先前使用basefont
创建并且从未移交给ARC进行控制的CTFontCreateWithName
必须使用CFRelease
明确释放。)
以下是我的书中更多的核心文本代码,显示了整个ARC内存管理:
http://www.apeth.com/iOSBook/ch23.html#_core_text
以下是我的书中有关ARC的CFType内存管理的部分:
http://www.apeth.com/iOSBook/ch12.html#_memory_management_of_cftyperefs
答案 1 :(得分:2)
/* OK */UIFont *boldFont = [UIFont fontWithName:@"DINPro-Medium" size:14];
assert(boldFont); // just be sure
/* OK */CTFontRef ctBoldFont = CTFontCreateWithName((__bridge CFStringRef)boldFont.fontName, boldFont.pointSize, NULL);
assert(boldFont); // just be sure
/* 1) CGColorRef cgColor = UIColorFromRGB(0x2b776d).CGColor; */
CGColorRef cgColor = CGColorCreateCopy( UIColorFromRGB(0x2b776d).CGColor );
assert(cgColor); // just to be sure
/* OK */NSNumber* underline = [NSNumber numberWithInt:kCTUnderlineStyleSingle];
NSDictionary *ULSubattributes = @{
/* you don't own the kCT strings */(__bridge NSString *)kCTFontAttributeName : CFBridgingRelease(ctBoldFont),
/* ... */ (__bridge NSString *)kCTForegroundColorAttributeName : CFBridgingRelease(cgColor),
/* ... */ (__bridge NSString *)kCTUnderlineStyleAttributeName : underline };
1)在iOS6之前的版本中存在一个错误,当你还在使用CGColorRef时,ARC会释放支持CGColorRef的UIColor。我知道这一点,因为我创建了一个rdar,然后在iOS 6中报告已修复。
PS:Mike Ash的一篇不错的博客here
编辑:此代码在我的iOS演示应用程序中正常工作(部署设置为5.1和6) - 请参阅日志消息。我把这个词作为ivar。
{
UIFont *boldFont = [UIFont fontWithName:@"Helvetica" size:14];
assert(boldFont); // just be sure
CTFontRef ctBoldFont = CTFontCreateWithName((__bridge CFStringRef)boldFont.fontName, boldFont.pointSize, NULL);
assert(boldFont); // just be sure
CGColorRef cgColor = CGColorCreateCopy( [UIColor colorWithRed:0.8f green:0.8f blue:0.8f alpha:0.8f].CGColor );
assert(cgColor);
NSNumber* underline = [NSNumber numberWithInt:kCTUnderlineStyleSingle];
assert(underline);
ULSubattributes = @{
(__bridge NSString *)kCTFontAttributeName : CFBridgingRelease(ctBoldFont),
(__bridge NSString *)kCTForegroundColorAttributeName : CFBridgingRelease(cgColor),
(__bridge NSString *)kCTUnderlineStyleAttributeName : underline };
NSLog(@"ULSubattributes: %@", ULSubattributes);
}
2013-04-12 11:48:20.294 WebViewScrollTester [44147:c07] ULSubattributes:{ CTForegroundColor =“[(kCGColorSpaceDeviceRGB)](0.8 0.8 0.8 0.8)”; NSFont =“CTFont \ nCTFontDescriptor {type = mutable dict,count = 1,\ nentries => \ n \ t1: {contents = \“NSFontNameAttribute \”} = {contents = \“Helvetica \”} \ n} \ n>“; NSUnderline = 1; }
EDIT2:我甚至添加了一个dispatch_after来显示ARC没有发布任何内容:
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 5 * NSEC_PER_SEC), dispatch_get_main_queue(), ^
{
NSLog(@"ULSubattributes: %@", ULSubattributes);
} );