2010-10-24 16 views
0

Je ne sais pas ce qui se passe ici, mais je le code suivant dans ma méthode init:appelant la méthode 'subviews de sur les augmentations de contentView d'une cellule de retenir le nombre

NSLog(@"retain count in init before alloc: %d", [game1CustomEntityInfoControl retainCount]); 

game1CustomEntityInfoControl = [[CustomEntityInfoControl alloc] initWithFrame:CGRectZero]; 

NSLog(@"retain count in init after alloc: %d", [game1CustomEntityInfoControl retainCount]); 

[[self contentView] addSubview:game1CustomEntityInfoControl]; 

NSLog(@"retain count in init after adding to superview: %d", [game1CustomEntityInfoControl retainCount]); 

Je sais que je devrais publierai game1CustomEntityInfoControl puisque la superview conserve l'objet mais laisse cela pour le moment.

Ensuite, dans ma méthode layoutSubviews je:

// We always call this, the table view cell needs to do its own work first 
[super layoutSubviews]; 

NSLog(@"retain count as soon as you enter layoutSubviews: %d", [game1CustomEntityInfoControl retainCount]); 

[[self contentView] subviews]; 

NSLog(@"retain count in layoutSubviews after calling subviews on contentView: %d", [game1CustomEntityInfoControl retainCount]); 

C'est la sortie:

2010-10-24 15: 14: 08,598 Sangaku [8592: 207] conserver dans le nombre avant alloc initialisation : 0

2010-10-24 15: 14: 08,603 Sangaku [8592: 207] retenir comptage dans initialisation après alloc: 1

2010-10-24 15: 14: 08,611 Sangaku [8592: 207] retenir count dans init après l'ajout de superview: 2

2010-10-24 15: 14: 08,616 Sangaku [8592: 207] ReTain compte dès que vous entrez dans layoutSubviews: 2

2010-10-24 15: 14: 08,621 Sangaku [8592 : 207] retain count dans layoutSubviews après l'appel de sous-vues sur contentView: 3

Regardez la dernière ligne de sortie. Comment le nombre de retenue est-il passé à 3? Les sous-vues effectuent-elles en interne une allocation qui est renvoyée comme auto-libérée?

Merci

+0

Je comprends que vous ne pouvez pas compter sur les comptes de retenue pour vous assurer que tout est bien géré. Ma question est: "Quelqu'un pourrait-il savoir si la méthode des sous-vues retourne en interne un tableau autoreleased?". Cela arrive régulièrement et je suis donc curieux. Est-ce que demander un objet à un index particulier dans un tableau retourne un objet autoreleased? Si c'est le cas, cela pourrait expliquer ce comportement. – user482393

+1

Oh désolé d'avoir mal interprété votre question initiale. Absolument, la méthode des sous-vues retourne un tableau autoreleased. Si ce n'était pas le cas, ce serait de la mémoire. Un modèle commun que vous verrez dans le code objectif-C est return [[obj retain] autorelease]; –

Répondre

1

AFIAK vous ne pouvez pas compter sur le retainCount se comporter de cette façon. Les internes du framework Cocoa pourraient ne rien faire avec vos objets, peut-être sur un thread différent/de manière asynchrone.

+1

Sur cette note, ce que l'OP doit réaliser est que tant qu'il suit les règles de propriété d'objet, il n'aura jamais à regarder le retainCount de toute façon. Et quand il est tenté de regarder retainCount, ça devrait être un gros drapeau rouge qu'il fait quelque chose de mal. – jer