2009-11-08 7 views
1

J'utilise une classe personnalisée en tant que délégué et source de données sur un UITableView. Je fais (quelque chose comme) dans ma méthode viewDidLoad:SDK iPhone: Comment/quand devrais-je libérer un objet délégué UITableView?

MyClass *myObject = [[MyClass alloc] init]; 
tableViewOutlet.delegate = myObject; 
tableViewOutlet.dataSource = myObject; 

Certes, j'ai besoin de diminuer le nombre de conserver myObject quelque part? Mais appeler [myObject release] ici a de très mauvais résultats - le délégué est détruit avant que la table ait fini de faire son travail.

J'ai essayé

MyClass *myObject = [[[MyClass alloc] init] autorelease]; 

mais elle a aussi des conséquences terribles.

Ai-je une fuite de mémoire ici? Si oui, comment et quand dois-je libérer le délégué en toute sécurité?

Répondre

2

Votre fichier d'interface:

@interface SomeClass: NSObject { 
    MyClass *myObject; 
} 
@property (nonatomic,retain) MyClass *myObject; 

@end 

Votre fichier de mise en œuvre:

@implementation SomeClass 
@synthesize myObject; 

-(void)dealloc { 
    // if you want to be safe, change tableViewOutlet properties... 
    // tableViewOutlet.delegate = nil; 
    // tableViewOutlet.dataSource = nil; 
    [myObject release]; // retain = 0 
    [super dealloc]; 
} 
... 
MyClass *obj = [[MyClass alloc] init]; // retain = 1 
self.myObject = obj; // retain = 2 

// NOTE: if you instead write: myObject = obj; **NO** retain msg will be sent. 
// *not* what you want in this context. 
tableViewOutlet.delegate = obj; // assign, so retain =2 
tableViewOutlet.dataSource = obj; // assign, so retain = 2 
[obj release]; // retain = 1 
... 

@end 
2

faire myObject une variable d'instance en déclarant dans le (fichier .h) @interface, puis appelez ...

[myObject release]; 

.. dans votre méthode dealloc.

Questions connexes