2010-06-07 6 views
2

J'ai le problème suivant: Dans un flux de l'exécution j'utilise alloc, et sur l'autre flux, alloc n'est pas nécessaire. À la fin de l'instruction if, dans tous les cas, je libère l'objet. Quand je fais 'build and Analize', j'obtiens une erreur: 'Le décrément incorrect du nombre de références d'un objet n'appartient pas à l'appelant'.Décrément incorrect du nombre de références

Comment résoudre ce problème?

UIImage *image; 

int RandomIndex = arc4random() % 10; 

if (RandomIndex<5) 
{ 
    image = [[UIImage alloc] initWithContentsOfFile:@"dd"]; 
} 
else 
{ 
    image = [UIImage imageNamed:@"dd"]; 
} 


UIImageView *imageLabel =[[UIImageView alloc] initWithImage:image]; 
[image release]; 
[imageLabel release]; 

Répondre

10

Vous devriez retain l'image dans la deuxième condition:

image = [[UIImage imageNamed:@"dd"] retain]; 

T à sa manière, les deux sorties possibles hors de la condition auront un objet avec un nombre de référence de un, de votre point de vue.

Sinon, vous essayez de release un déjà autorelease d objet!

2

Au lieu de:

image = [UIImage imageNamed:@"dd"]; 

Do:

image = [[UIImage imageNamed:@"dd"] retain]; 
+1

Ou dans l'autre sens, définissez l'alloc'd pour une libération automatique. –

2

imageNamed renvoie autoreleased objet. Vous ne pouvez libérer qu'un objet dont vous êtes propriétaire.

Cela fonctionne:

if (RandomIndex<5) 
{ 
    image = [[UIImage alloc] initWithContentsOfFile:@"dd"] autorelease]; 
} 
else 
{ 
    image = [UIImage imageNamed:@"dd"]; 
} 


UIImageView *imageLabel =[[UIImageView alloc] initWithImage:image]; 
[imageLabel release]; 
8

Vous pouvez faire ce que d'autres ont suggéré, ou:

if (RandomIndex<5) 
{ 
    image = [UIImage imageWithContentsOfFile:@"dd"]; 
} 
else 
{ 
    image = [UIImage imageNamed:@"dd"]; 
} 

UIImageView *imageLabel =[[UIImageView alloc] initWithImage:image]; 
... 
[imageLabel release]; 

De cette façon, dans les deux cas, vous obtenez un objet autoreleased image, que vous faites pas alors besoin de vous libérer.

Questions connexes