2010-07-10 10 views
0

Je reçois le décompte d'allocation plus un dans le code ci-dessous.Obtenir le compte d'allocation plus un à UIImage dans l'objectif-c?

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    UITableViewCell *cell = (UITableViewCell *)[tableView dequeueReusableCellWithIdentifier:@"MyIdentifier"]; 
    if (cell == nil) 
    { 
     cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:@"MasterViewIdentifier"] autorelease]; 
     cell.accessoryType = UITableViewCellAccessoryNone; 
     cell.selectionStyle = UITableViewCellEditingStyleNone; 
     UIView* elementView = [ [UIView alloc] initWithFrame:CGRectMake(5,5,312,480)]; 
     elementView.tag = 0; 
     [cell.contentView addSubview:elementView]; 
     [elementView release]; 
    } 
    UIView* elementView = [cell.contentView viewWithTag:0]; 
    for(UIView* subView in elementView.subviews) 
    { 
     [subView removeFromSuperview]; 
    } 

    if(indexPath.section==0) 
    { 
     if(indexPath.row==0) 
     { 
        // i have tried like this but getting exception. 
      /* 
      UIImage *cellBackImag=[UIImage imageNamed:@"celltop.png" ]; 
      UIImageView* imaeView=[[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 300, 43)]; 
      imaeView.image=cellBackImag; 
      [elementView addSubview:imaeView]; 
      [imaeView release]; 
      [cellBackImag release]; 
      */ 


      // here I am getting uiimage count allocation count 
      UIImageView* imaeView=[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"celltop.png" ]]; 
      imaeView.frame=CGRectMake(0, 0, 300, 43); 
      [elementView addSubview:imaeView]; 
      [imaeView release]; 

S'il vous plaît, aidez-moi cela, Merci, Madan Mohan

Répondre

2

Tout d'abord, vous ne devriez pas compter sur le compte retenir, parce que lorsque vous passez l'objet à une méthode toutes les choses pourraient se produire avec cet objet, comme quelqu'un le retient, le relance automatiquement, le passe à une autre méthode, etc., etc. La valeur est donc très imprécise. Mais ici, dans votre cas, le nombre de retards de (au moins) +1 est correct, car vous voulez que votre vue d'image reste active après l'avoir ajoutée en tant que sous-vue à elementView, donc [element addSubview:imageView] conserve votre vue d'image (en ajoutant +1 au compte de retenue) et vous le relâchez ensuite (en laissant le +1 de alloc init).

La raison pour laquelle vous obtenez l'exception avec le code commenté est que vous créez un objet autoreleased pour cellBackImag puis que vous le libérez. Après le retour de votre méthode, à un moment donné, le pool autorelease relâchera l'image, et là, il tombera en panne. Il suffit donc de s'en tenir à la deuxième approche (alloc, init, add, release) et d'oublier le nombre de retain. Si vous vous inquiétez des fuites de mémoire, jetez un oeil à Instruments, qui est un excellent outil pour trouver toutes sortes de bugs.

+0

+1. Ignorez le nombre réel, utilisez la gestion de la mémoire appropriée (si vous le possédez, vous êtes responsable de la libérer) et utilisez Instruments pour rechercher les fuites réelles. – Abizern