2010-08-31 2 views
0

Je génère un simple scrollView avec des images attachées aux boutons. Cela fonctionne bien, à part le fait que cette vue de défilement prend assez de mémoire. Depuis ce scrollView est juste un sous-menu permettant à l'utilisateur de choisir une image et bientôt après je n'en ai pas besoin, je voudrais libérer ce bloc lourd de la mémoire.La manière actuelle de libérer de la mémoire à partir d'une vue UIScroll avec de nombreuses images

Pouvez-vous aider à bien vouloir me faire à comprendre cette question, et sans ce grand bloc de mémoire lorsqu'ils ne sont pas nécessaires

int flipFlop = 1; 
masksAvailable = 18; 
float topMaskXX = 85.0; 
float topMaskYY = 96.0; 
UIButton *button; 
for (int buttonsLoop = 1;buttonsLoop < masksAvailable+1;buttonsLoop++){ 


    button = [UIButton buttonWithType:UIButtonTypeCustom]; 
    NSString *tempname = [NSString stringWithFormat:@"mask_frame%i.png",buttonsLoop]; 

    // This fellow there is the memory eating monster 
    [button setBackgroundImage:[UIImage imageNamed:tempname] forState:UIControlStateNormal]; 

    tempname = nil; 

    button.tag = buttonsLoop; 
    [button addTarget:self action:@selector(handleMaskKeys:) forControlEvents:UIControlEventTouchUpInside]; 


    UIImageView *frameForSubImages = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"image_frame.png"]]; 
    frameForSubImages.frame = CGRectMake(0.0, 0.0, 320.0/2.9, 480.0/2.9); 
    frameForSubImages.center = CGPointMake(topMaskXX,topMaskYY); 
    [scrollView addSubview:frameForSubImages]; 


    button.frame = CGRectMake(0.0, 0.0, 320.0/3.4, 480.0/3.4); 
    button.center = CGPointMake(topMaskXX,topMaskYY); 
    if (flipFlop == 1){ 
    topMaskXX += 150; 
    } else { 
    topMaskYY += 185.0; 
    topMaskXX = 85.0; 

    } 
    flipFlop = flipFlop * -1; 
    [scrollView addSubview:button]; 






} 

Répondre

0

Tout d'abord, je voudrais suggérer que vous faites un « Clean All » et "Construire et analyser" sur votre projet. Il est très bon pour signaler les problèmes de conservation/libération. Deuxièmement, toute classe qui conserve des objets doit définir un «dealloc» qui libère ces objets pour s'assurer qu'ils sont supprimés lorsque l'objet est libéré.

-(void) dealloc { 
    // release all retained objects here. 

    [super dealloc]; 
} 

En troisième lieu, dans votre exemple ci-dessus, il semble aussi que frameForSubImages pourrait avoir un supplémentaire sur elle retenir, puisque vous avez alloué, il (1 référence) et lui a attribué à une vue (1 référence) sans toujours appelez la version (qui serait -1 référence et vous laisser avec un refcount de 1).

Enfin, je recommande également de lire le Memory Management Programming Guide pour iOS.

Questions connexes