J'ai créé une vue de texte de base et, visuellement, ça fonctionne très bien, mais je l'utilise pendant 30 minutes avec beaucoup de données qui arrivent et ça plante. Le débogueur commence à dire 'avertissement de mémoire reçu'. Je pense que les vues que je dessine qui actualisent sur chaque nouvelle ligne qui vient de telnet, ne laissent pas la mémoire sur un redraw complètement. code ci-dessous. La première partie de ce code pourrait être un problème. J'ai trouvé sur un redessin que j'ai dû effacer les vieilles vues ou il a été étendu ou dessiné sur le dessus et le texte s'est brouillé. Mais ce pourrait être l'une de mes variables que je crée qui deviennent persistantes.core text view fuite de mémoire
- (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];
}
la définition de classe est:
@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
a analysé. avoir un problème de mémoire, il dit. Potentiellement fuite dans l'objet stocké dans le chemin – LanternMike
maintenant libérant police frame et frame ainsi et verra si elle fixe – LanternMike
de la documentation du développeur Apple sur le texte de base, ils libèrent frameetter et cadre, mais pas la police, donc ne relasing police maintenant et je suppose que je verra. était sur relâcher libérant la police et la couleur et avait des accidents. Maintenant, j'essaie de faire correspondre la page Apple sur ce qu'il faut libérer. – LanternMike