Bien qu'il soit possible que le code que vous avez trouvé était simplement bâclé, ce modèle a une signification.
"alloc, autorelease, conserver" implique que l'objet est référencé dans deux endroits:
- En tant que valeur de retour sur la pile d'appel (style autorelease)
- par le SDK FB lui-même (le ' retenir ')
Cela est important si les deux références peuvent être libérées indépendamment. Par exemple, si le SDK peut libérer sa référence AVANT que la pile d'appel soit terminée et vider le pool de libération automatique. Ok, c'est assez nuancé; Qu'est ce que je veux dire?
Tenir compte de ces cas:
A) le code réel
_facebook = [[[[Facebook alloc] init] autorelease] retain];
_facebook a maintenant conserver le nombre de 2, et attend 2 appels à la 'libération': 1 de celui qui a appelé " retenez ", et 1 à un moment donné dans le futur lorsque le NSAutoreleasePool se vide.
B) simple "alternative" proposée (non équivalent)
_facebook = [[Facebook alloc] init];
_facebook a un retain nombre de 1 et sera détruit lors de 'libération' est appelé (potentiellement un gros problème si le pool d'autorelease n'a pas encore été drainé et la pile d'appels utilise toujours l'objet)
Pourquoi est-ce important? Imaginez un code comme celui-ci:
@implementation (Thinger)
+(id) make_new_thing
{
return my_copy_of_thing = [[[[Thing alloc] init] autorelease] retain];
}
+(id) forget_about_thing
{
if (my_copy_of_thing != nil) {
[my_copy_of_thing release];
my_copy_of_thing = nil;
}
}
@end
void foo() {
NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];
id thing = [Thinger make_new_thing];
[Thinger forget_about_thing];
...
[thing useThing]; // implementation B would break here !
[pool drain];
}
Um, que diable ??? –
Hmm, je pense que je ferais mieux de désinstaller l'application Facebook. Ils ne comprennent clairement pas ce qu'ils font. – JeremyP