2013-09-12 2 views
0

xCode5 ссылается на новую ошибку CoreText, которую я не видел в предыдущих версиях xCode. У меня есть следующий код:Утечка нового сердечника в xCode5

CTFramesetterRef framesetter = CTFramesetterCreateWithAttributedString((__bridge CFMutableAttributedStringRef)self.text); 
CGMutablePathRef mutablePath = CGPathCreateMutable(); 

CGPathAddRect(mutablePath, NULL, self.bounds); 

self.textFrame = CTFramesetterCreateFrame(framesetter, CFRangeMake(0, 0), mutablePath, NULL); 

CGPathRelease(mutablePath); 
CFRelease(framesetter); 

И анализатор указывает на последнюю строку CFRelease(framesetter) и сказать «Потенциал утечки объекта».

Кто-нибудь, как это исправить, и почему я вижу это только в xCode5?

+0

Вы _two_ вызовы ядра Foundation с 'Create' в названии. Вы должны «CFRelease» и то, и другое. Xcode 5, по-видимому, лучше анализирует код и находит утечки, чем предыдущие версии. – Rob

+0

@Rob - Еще раз спасибо. Да, хорошо знать, что xCode5 улучшился в этом отношении, не уверен, как мой код не рушился, это довольно вопиющее. –

ответ

1

вы создаете framesetter и никогда не освободить его

self.textFrame = CTFramesetterCreateFrame(..... 

== новый объект, который создается, но не освобождены.

изменение:

CTFramesetterRef newFrameSetter = CTFramesetterCreateFrame(..... 
self.textFrame = newFramesetter; 
if(newFramesetter) CFRelease(newFrameSetter); 

как почему только Xcode 5: потому что он предлагает больше предупреждений, чем раньше. в этом отношении он был улучшен, я предположил бы, что

+0

Ничего себе удивление. Я никогда не получал сбоев от этого, еще раз спасибо. –

0

@ Dauh-Джан

но это может вызвать проблемы exc_bad_address на self.textFrame?

self.mAttributeString = [self fixLastLineMissBugWhenDrawWithCoreText:self.mAttributeString]; 


CTFramesetterRef frameSetter = CTFramesetterCreateWithAttributedString((CFAttributedStringRef)self.mAttributeString); 

CGSize size = CTFramesetterSuggestFrameSizeWithConstraints(frameSetter, CFRangeMake(0, self.mAttributeString.length), NULL, CGSizeMake(self.widthLimit, CGFLOAT_MAX), NULL); 
self.height = size.height + 0.5; 

CGMutablePathRef path = CGPathCreateMutable(); 
CGPathAddRect(path, NULL, CGRectMake(0, 0, self.widthLimit, self.height)); 
NSUInteger length = self.mAttributeString.length; 

CTFrameRef ctFrame = CTFramesetterCreateFrame(frameSetter, CFRangeMake(0, length), path, NULL); 
self.ctFrame = ctFrame; 

CFRelease(ctFrame); 
CGPathRelease(path); 
CFRelease(frameSetter); 

это решить Potential leak of an object предупреждение, однако это приведет к self.ctFrame exc_bad_address проблемы ...

Смежные вопросы