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.