0
我創建了一個核心文本視圖,並且它的視覺效果很好,但是我運行了30分鐘,大量數據進來並崩潰。調試器開始說'收到內存警告'。我認爲我所繪製的視圖在從telnet進入的每一個新行上刷新後,都不會完全在重繪上留下內存。代碼如下。這段代碼的第一部分可能是一個問題。我發現在重繪的時候,我必須清除舊的視圖,或者將它放在頂部或文本上,而文本則會出現亂碼。但它可能是我創建的任何變量都變得持久。核心文本視圖內存泄漏
- (void)buildFrames
{
for (UIView __strong *view in self.subviews) {
[view removeFromSuperview];
view = nil;
}
frameXOffset = 20; //1
frameYOffset = 0;
double height=0;
double oldHeight = 0;
int columnIndex = 0;
self.frames=nil;
self.frames = [NSMutableArray array];
// self.pagingEnabled = YES;
self.delegate = self;
CGRect textFrame = CGRectInset(self.bounds, frameXOffset, frameYOffset);
// set string
int spot =0;
if(self.chatLog != nil && self.chatLog != NULL)
if(self.chatLog.total > 300)
spot = self.chatLog.total - 300;
if(spot < 0)
spot=0; // double check for thread saftey;
int _total = self.chatLog.total;
if(_total < 0 || _total > self.chatLog.max)
return;
if(self.chatLog != nil && self.chatLog != NULL)
for(int index = spot; index < _total; index ++)
{
NSString *theTell = [self.chatLog getChatAt:index];
NSString *chatType = [self.chatLog getTypeAt:index];
if(theTell == nil || theTell == NULL)
{ [email protected]"nil";
chatType = @"line";
}
attString=nil;
attString = [[NSMutableAttributedString alloc] initWithString:theTell];
//else
// attString = [[NSAttributedString alloc] initWithString:@"Hello core text world"];
CTFontRef font = CTFontCreateWithName(CFSTR("Courier"), self.fontSize, NULL);
CFAttributedStringSetAttribute((__bridge CFMutableAttributedStringRef)(attString), CFRangeMake(0, CFAttributedStringGetLength((__bridge CFAttributedStringRef)(attString))), kCTFontAttributeName, font);
if([chatType isEqual: @"line"])
{
CFAttributedStringSetAttribute((__bridge CFMutableAttributedStringRef)(attString), CFRangeMake(0, CFAttributedStringGetLength((__bridge CFAttributedStringRef)(attString))), kCTForegroundColorAttributeName, _lineColor);
}
else if([chatType isEqual: @"notify"])
{
CFAttributedStringSetAttribute((__bridge CFMutableAttributedStringRef)(attString), CFRangeMake(0, CFAttributedStringGetLength((__bridge CFAttributedStringRef)(attString))), kCTForegroundColorAttributeName, _notifyColor);
}
else if([chatType isEqual: @"tell"])
{
CFAttributedStringSetAttribute((__bridge CFMutableAttributedStringRef)(attString), CFRangeMake(0, CFAttributedStringGetLength((__bridge CFAttributedStringRef)(attString))), kCTForegroundColorAttributeName, _tellColor);
}
else
{
CFAttributedStringSetAttribute((__bridge CFMutableAttributedStringRef)(attString), CFRangeMake(0, CFAttributedStringGetLength((__bridge CFAttributedStringRef)(attString))), kCTForegroundColorAttributeName, _defaultColor);
}
textFrame = CGRectMake(0, 0, self.bounds.size.width, self.fontSize+4);
CGMutablePathRef path = CGPathCreateMutable(); //2
CGPathAddRect(path, NULL, textFrame);
CTFramesetterRef framesetter = CTFramesetterCreateWithAttributedString((__bridge CFAttributedStringRef)attString);
int textPos = 0; //3
while (textPos < [attString length]) { //4
// CGPoint colOffset = CGPointMake((columnIndex+1)*frameXOffset + columnIndex*(textFrame.size.width), 20);
CGPoint colOffset = CGPointMake( 20, (columnIndex+1)*frameYOffset + columnIndex*(textFrame.size.height));
CGRect colRect = CGRectMake(0, 0 , textFrame.size.width-10, textFrame.size.height);// was -40
CGMutablePathRef path = CGPathCreateMutable();
CGPathAddRect(path, NULL, colRect);
//use the column path
CTFrameRef frame = CTFramesetterCreateFrame(framesetter, CFRangeMake(textPos, 0), path, NULL);
CFRange frameRange = CTFrameGetVisibleStringRange(frame); //get visiblestringrange
//create an empty column view
CTColumnView *content = [[CTColumnView alloc] initWithFrame: CGRectMake(0, 0, self.contentSize.width, self.contentSize.height)];
content.backgroundColor = [UIColor clearColor];
content.frame = CGRectMake(colOffset.x, colOffset.y, colRect.size.width, colRect.size.height) ;
//set the column view contents and add it as subview
[content setCTFrame:(__bridge id)frame]; //6
[self.frames addObject: (__bridge id)frame];
[self addSubview: content];
//prepare for next frame
textPos += frameRange.length;
//CFRelease(frame);
CFRelease(path);
columnIndex++;
oldHeight = height;
height= [self measureFrameHeight:frame];
}
}// end while
//set the total width of the scroll view
int totalPages = (columnIndex) ; //7
// self.contentSize = CGSizeMake(totalPages*self.bounds.size.width, textFrame.size.height);
self.contentSize = CGSizeMake(textFrame.size.width, (textFrame.size.height) * (totalPages -1) + height + 40);
[self scrollRectToVisible:CGRectMake(0, 0 , textFrame.size.width-10, (textFrame.size.height) * (totalPages -1) + height +40) animated: FALSE];
}
類的定義是:
@interface ConsoleView :UIScrollView<UIScrollViewDelegate>
{
float frameXOffset;
float frameYOffset;
NSMutableArray *frames;
}
@property (strong, nonatomic) NSAttributedString *attString;
-(void) addNewText:(NSString *) text;
@property (weak, nonatomic) NSMutableArray *frames;// was reatin not strong
- (void)buildFrames;
@property (strong, nonatomic) ChatTextQueue *chatLog;
@property (nonatomic) int fontSize;
@property (strong, nonatomic) UIColor *userColor;
@property (nonatomic) CGColorRef notifyColor;
@property (nonatomic) CGColorRef lineColor;
@property (nonatomic) CGColorRef defaultColor;
@property (nonatomic) CGColorRef tellColor;
@end
做了分析。它有一個內存問題。 pottential泄漏到存儲在路徑 – LanternMike 2013-02-17 13:34:37
現在釋放字體framesetter和框架,並會看到它是否修復它從核心文本的蘋果開發者文檔 – LanternMike 2013-02-17 14:24:08
,他們釋放framesetter和框架,但不是字體,所以不現在relasing字體,我想我等着瞧。結束髮布釋放字體和顏色,並崩潰。現在我試圖匹配蘋果頁面發佈什麼。 – LanternMike 2013-02-17 17:44:04