2013-02-17 2 views
0

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 

Répondre

1

vous n'êtes pas certains objets publie une, par exemple font, framesetter et frame. Utilisez la commande Analyser dans xCode pour rechercher toutes les fuites de mémoire dans votre méthode buildFrames.

+0

a analysé. avoir un problème de mémoire, il dit. Potentiellement fuite dans l'objet stocké dans le chemin – LanternMike

+0

maintenant libérant police frame et frame ainsi et verra si elle fixe – LanternMike

+0

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