La gestione della memoria

di il
1 risposte

La gestione della memoria

Perchè il dealloc non funziona relativamente all'oggetto calcolatrice aggiunto ad array nonostante l'attributo __weak di oggettoContenuto?

- (void)viewDidLoad
{
        NSMutableArray *array=[[NsMutableArray alloc] init];
	zaino = [[Oggetto alloc]init];
	[zaino setNome:@"zaino"];
	calcolatrice = [[Oggetto alloc]init];
	[calcolatrice setNome:@"calcolatrice"];
	[zaino setOggettocontenuto:calcolatrice];
	[array addObject:calcolatrice];
	array=nil;

}

Oggetto.h
#import <Foundation/Foundation.h>

 
Oggetto.h

@interface Oggetto : NSObject

{
    NSString *nome;
    Oggetto *contenitore;
    __weak Oggetto *oggettoContenuto;

}


Oggetto.m

-(void)dealloc
{
    NSLog(@"Oggetto eliminato: %@",self);
}

-(void) setContenitore:(Oggetto *)cont
{
    contenitore=cont;
}

 

-(Oggetto *) contenitore
{
    return contenitore;
}

-(void) setOggettocontenuto:(Oggetto *)cont
{
    oggettoContenuto=cont;
    [cont setContenitore:contenitore];
    //oppure
    [cont setContenitore:self];
}

 

-(Oggetto *) oggettocontenuto
{
    return oggettoContenuto;
}

1 Risposte

  • Re: La gestione della memoria

    Mi rispondo da solo :

    Se due oggetti sono in relazione padre-figlio e contemporanemente figlio-padre allora il padre deve essere dichiarato strong (implicito) e il figlio weak per cui il dealloc funziona se si ha ad esempio :
    
    @interface Oggetto:NSObject
    {
        NSString *nome;
        Oggetto *contenitore;
        Oggetto __weak *oggettoContenuto;
    
    }
    
    (void)setContenitore:(Oggetto *) cont;
    -(void)setOggettocontenuto:(Oggetto *) cont;
    
    e in ViewDidLoad
    
    Oggetto *calcolatrice =[[Oggetto alloc] init];
    [calcolatrice setNome:@"Calcolatrice"];
    Oggetto *zaino =[[Oggetto alloc] init];
    [zaino setNome:@"Zaino"];
    [calcolatrice setContenitore:zaino];
    [zaino setOggettoContenuto:calcolatrice]];
    
    
    Oggetto.m
    
    -(void)dealloc
    {
        NSLog(@"Oggetto eliminato: %@",self);
    }
    
    -(void) setContenitore:(Oggetto *)cont
    {
        contenitore=cont;
    }
    
    -(Oggetto *) contenitore
    {
        return contenitore;
    }
    
    -(void) setOggettocontenuto:(Oggetto *)cont
    {
        oggettoContenuto=cont;
    }
    
    
    -(Oggetto *) oggettocontenuto
    {
        return oggettoContenuto;
    }
    In tal caso il dealloc funziona.
    Se invece fosse stato:

    Oggetto *contenitore:
    Oggetto *oggettoContenuto;

    il dealloc non avrebbe funzionato.
Devi accedere o registrarti per scrivere nel forum
1 risposte