2010-06-17 4 views
2

Hé les gars, supposons que le code suivant:compte de référence Objective-C et AutoRelease

int main (int argc, const char * argv[]) 
{ 
//[...] 
    Rectangle* myRect = [[Rectangle alloc] init]; 

    Vector2* newOrigin = [[[Vector2 alloc] init] autorelease]; // ref count 1 

    [newOrigin setX: 50.0f]; 
    [myRect setOrigin: newOrigin]; // ref count 2 

    [myRect.origin setXY: 25.0f :100.0f]; // ref count goes to 3... why ? 

    [myRect release]; 

    [pool drain]; 
    return 0; 
} 

origine du rectangle est déclarée comme une propriété synthétisée (conserver). me demandais 2 choses:

  1. comte Pourquoi ne ref va à 3 lors de l'utilisation du accesseur getter de l'origine du rectangle? Est-ce que je fais quelque chose de mal ?
  2. Avec un nombre de références de 3, je ne comprends pas comment cet extrait de code ne peut pas fuir. L'appel de release sur myRect le fera descendre à 2 depuis que j'appelle release sur l'origine dans dealloc(). Mais alors, quand la libération automatique prend-elle effet?

Merci!

Répondre

5

Pourquoi le nombre ref va à 3 lorsque en utilisant l'accesseur getter origine du rectangle?

Parce que votre @property est déclarée comme atomic (par défaut) et, par conséquent, le getter synthétisé conserve et autoreleases la valeur de retour.

Est-ce que je fais quelque chose de mal?

Oui. Vous étudiez les chiffres absolus de conservation.

Le nombre absolu de retenue de n'importe quel objet est assez complètement inutile à considérer. Vous vous souciez seulement des deltas; Si vous augmentez le nombre de retenues, vous devez le diminuer.

Avec un compte de référence de 3, je ne comprendre comment ce bout de code ne peut pas fuir. Appeler la libération sur myRect le fera descendre à 2 depuis que j'appelle la libération sur l'origine dans dealloc(). Mais alors, quand est-ce que autorelease prend l'effet ?

Un autorelease est tout simplement un retard release qui se déclenche lorsque la piscine contenant est drain ed. Ainsi, dans votre cas, l'objet sera désalloué lorsque [pool drain]; est exécuté.

+0

Bonne information.Je ne connaissais pas le getter appelé retenir/autorelease. Merci beaucoup! – vdsf

+0

Heureux de vous aider ... – bbum

2

De la documentation d'Apple sur -retainCount:

Important: Cette méthode est généralement de aucune valeur dans le débogage des problèmes de gestion de la mémoire . Parce que tout nombre d'objets-cadre peut avoir conservé un objet afin de contenir des références à lui, tout en même temps piscines autorelease peut détenir tout nombre de rejets différés sur un objet , il est très peu probable que vous peut obtenir des informations utiles à partir de cette méthode .