2010-10-16 38 views
0

que je fais cela avec UISwitchs et UITextFields ...Ajout @property UISwitch à TableView Causes RetainCount problèmes

J'ai déclaré UISwitch comme propriété dans le fichier d'en-tête, parce que je veux accéder à sa valeur dans plusieurs méthodes différentes dans ma classe.

J'ajoute les UISwitch à un de mes TableViewCells, en utilisant le code suivant:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 

static NSString *CellIdentifier = @"Cell"; 
UITableViewCell *cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; 

mySwitch = [[[UISwitch alloc] initWithFrame:CGRectZero] autorelease]; 
cell.accessoryView = mySwitch; 
mySwitch.on = YES; 

return cell; 

} 

Comme il est, les retainCounts sont partout. Le mySwitch Retain est de 2 au moment où la cellule a été placée sur l'écran, et chaque fois que j'appuie sur l'interrupteur, le nombre de retenue augmente, jusqu'à ce qu'il atteigne 4, puis il semble rester là.

Évidemment, il me manque quelque chose. Si quelqu'un peut me diriger dans la bonne direction, ce serait grandement apprécié.

Répondre

1

Chasing the retainCount d'un objet n'est pas quelque chose que vous voulez faire lorsque des API privées interagissent avec lui. Tout ce que vous voulez faire est de suivre vos propres comptes de retenue, puis assurez-vous de l'incrémenter et de le décrémenter si nécessaire. En supposant que vous avez quelque chose comme ce qui suit:

@property (nonatomic, retain) UISwitch *mySwitch; 

@synthesize mySwitch; 

Vous devez changer votre code que vous avez ci-dessus pour être ceci:

self.mySwitch = [[[UISwitch alloc] initWithFrame:CGRectZero] autorelease]; 
cell.accessoryView = mySwitch; 
mySwitch.on = YES; 

Dans le code que vous avez ci-dessus, vous ne possédez pas plus mySwitch que vous lui a dit d'autorelease. Toutefois, en utilisant self.mySwitch, vous conserverez la propriété lorsque vous l'avez créée. Ensuite, vous pouvez l'utiliser comme vous le souhaitez tout au long du programme. Assurez-vous juste de le libérer en toute sécurité dans dealloc.

+0

Évidemment, je ne comprends pas la bonne utilisation de «soi», je vais devoir faire quelques lectures sur ce sujet. – Chris

+0

Oui, c'est une partie très importante de l'objectif-c lors de l'utilisation des propriétés. Fondamentalement, si vous n'utilisez pas self, le getter ou setter synthétisé ne sera pas utilisé. Vous accéderez directement au pointeur. – rickharrison

0

1: Ne faites jamais attention à ce qui est retourné par retainCount. Ce n'est pas destiné à être une valeur interprétable humaine. 2: Essayez d'exécuter build et d'analyser. Il peut trouver beaucoup de problèmes de mémoire, comme celui-ci, et expliquer ce qui ne va pas. 3: Chaque fois que vous appelez alloc, vous avez besoin d'une version correspondante (ou autorelease). Dans ce cas, vous pouvez appeler [mySwitch release] après mySwitch.on = YES. 4: Il est utile de revoir périodiquement les règles de gestion de la mémoire pour Objective-C. http://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmRules.html