2011-12-04 32 views
0

我使用没有与ARC编译了下面的代码行,我需要转换了,当我升级我的项目现有的库:ARC代码转换 - 此NumberRef更改是否正确?

CFAttributedStringSetAttribute(text, 
    CFRangeMake(position, length), 
    kCTStrokeWidthAttributeName, 
    [NSNumber numberWithFloat:[[attributes objectForKey:@"stroke"] intValue]]); 

与ARC编译的过程中产生了一些错误,我修改了代码以使其更加合规。代码更改是否正确?

int strokeInt = [[attributes objectForKey:@"stroke"] intValue]; 
CFNumberRef strokeNumber = CFNumberCreate(NULL, kCFNumberSInt32Type, &strokeInt); 

CFAttributedStringSetAttribute(text, 
    CFRangeMake(position, length), 
    kCTStrokeWidthAttributeName, 
    strokeNumber); 

任何意见,将不胜感激。

+0

您是否从此代码获取任何编译器或静态分析器警告? – NSResponder

+0

没有警告。但我想检查它的语义。 –

回答

1

你在泄漏strokeNumber,除非你打电话给CFRelease就可以了。但是CFNumber是免费电话与NSNumber桥接,这样可以消除strokeNumber,只是使用强制:

CFAttributedStringSetAttribute(text, 
    CFRangeMake(position, length), 
    kCTStrokeWidthAttributeName, 
    (__bridge CFNumberRef)[NSNumber numberWithFloat:[[attributes objectForKey:@"stroke"] intValue]]); 

此外,如果[attributes objectForKey:@"stroke"]正好已经是一个NSNumber,可以简化到只此:

CFAttributedStringSetAttribute(text, 
    CFRangeMake(position, length), 
    kCTStrokeWidthAttributeName, 
    (__bridge CFNumberRef)[attributes objectForKey:@"stroke"]);