Question

Question stupide, mais pourquoi devons-nous utiliser «conserver» lors de la déclaration d'une propriété? Ne se retient-il pas de toute façon quand il se voit attribuer quelque chose?

En regardant cet exemple, il semble qu'un objet soit automatiquement conservé lors de l'allocation, alors quel est le point?

#import "Fraction.h"
#import <stdio.h>

int main( int argc, const char *argv[] ) {
    Fraction *frac1 = [[Fraction alloc] init];
    Fraction *frac2 = [[Fraction alloc] init];

    // print current counts
    printf( "Fraction 1 retain count: %i\n", [frac1 retainCount] );
    printf( "Fraction 2 retain count: %i\n", [frac2 retainCount] );

    // increment them
    [frac1 retain]; // 2
    [frac1 retain]; // 3
    [frac2 retain]; // 2

    // print current counts
    printf( "Fraction 1 retain count: %i\n", [frac1 retainCount] );
    printf( "Fraction 2 retain count: %i\n", [frac2 retainCount] );

    // decrement
    [frac1 release]; // 2
    [frac2 release]; // 1

    // print current counts
    printf( "Fraction 1 retain count: %i\n", [frac1 retainCount] );
    printf( "Fraction 2 retain count: %i\n", [frac2 retainCount] );

    // release them until they dealloc themselves
    [frac1 release]; // 1
    [frac1 release]; // 0
    [frac2 release]; // 0

■ Sortie

Fraction 1 conserve le nombre: 1

Fraction 2 conserve le nombre: 1

Fraction 1 Repose le nombre: 3

Fraction 2 conserve le nombre: 2

Fraction 1 conserve le nombre: 2

Fraction 2 conserve le nombre: 1

Fraction de trafic

Fraction de trafic


Ça me rend fou!

Était-ce utile?

La solution

Le comportement par défaut d'une propriété est attribué, pas conserver. Ce ne sont pas le même comportement. Si votre propriété est pour un type de données primitif, comme un INT, alors Assign serait correct à utiliser. Cependant, si vous spécifiez (conserver) et que la propriété pointe vers un pointeur d'objet tel que l'objet NSObject *, le pointeur se voit attribuer l'adresse de mémoire de l'objet et son nombre de conserve est incrémenté d'un. Si votre programme ne se compose rien de plus qu'une fonction principale seule, alors son but est difficile à voir. Cependant, supposons que votre classe avait cette méthode:

-(void)setMyArrayWithString:(NSString *)s{
    myArray = [NSArray arrayWithObject:s];
    }

Supposons que MyArray soit défini comme nsArray * MyArray et a la déclaration appropriée @Property (conserver). Tout fonctionne bien jusqu'à ce que la méthode revienne. En effet, l'objet renvoyé de NSARAY est un objet automatique. Si nous ne le conservons pas, il sera publié par le NsautoreleAlepool et nous ne pourrons pas l'utiliser (et nous obtiendrons des bugs désagréables et de mauvaises violations d'accès). Pour résoudre ce problème, nous pouvons faire l'une des deux choses:

-(void)setMyArrayWithString:(NSString *)s{
    self.myArray = [NSArray arrayWithObject:s];
// OR
    myArray = [[NSArray arrayWithObject:s] retain];    
}

La première solution utilise Self.MyArray pour utiliser la définition de @Property. Ce code attribue puis conserve l'objet afin que nous ne le perdons pas lorsque la fonction revient. La deuxième solution définit manuellement le pointeur NSArray * MyArray, puis conserve manuellement l'objet NSArray. Quoi qu'il en soit, le NsautoreleAleaspool libèrera l'objet à la fin de la fonction, mais il ne sera pas traité parce que nous avons toujours notre conservation de le garder en vie.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top