2011-12-04 35 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"]);