2010-06-18 4 views
5

Je regardais le code de quelqu'un d'autre et j'ai remarqué qu'ils appelaient 'release' sur un NSString qu'ils ne possédaient pas (jamais appelé alloc/retain/copy n'importe où et ce n'était pas une propriété). Cela m'a paru un peu étrange et cela m'a fait me demander si un comportement étrange peut se produire si vous appelez 'release' sur un objet que vous ne possédez pas ou dont le compte ref est déjà 0? Le code ci-dessous compile/fonctionne bien sans avertissements alors je suppose qu'il n'y a pas de problème mais j'étais juste curieux.Vous appelez 'release' trop de fois?

// Releasing an object I don't own 
NSString *notMyString = [NSString stringWithString:@"Not mine."]; 
[notMyString release]; // Ignored? 

// Releasing an object I own, twice 
NSString *myString = [[NSString alloc] initWithString:@"Mine."]; 
[myString release]; // Ref count = 0 
[myString release]; // Ref count = ? 
+2

La raison pour laquelle le code "fonctionne" est parce que -initWithString de NSString: reconnaît que la chaîne passée est une chaîne constante et, par conséquent, il n'y a pas besoin d'une nouvelle allocation. Puisque les chaînes constantes ignorent effectivement conserver/libérer, le code fonctionne par coïncidence. – bbum

Répondre

15

Oui, ne faites pas cela. Votre évaluation est correcte, tout comme votre compréhension des règles de propriété. Envoyer un message à un objet déjà publié a un comportement indéfini - parfois vous aurez de la chance à cause d'autres choses qui se passent et rien ne se passera. Parfois, vous vous écraserez immédiatement, parfois plus tard parce que vous avez corrompu quelque chose d'autre.

+2

Oui, c'est le comportement à long terme qui m'inquiétait. Je suppose que vous ne pouvez pas toujours faire confiance au code "tutoriel" du blog aléatoire tel quel =). Merci pour la réponse rapide. – nebs

Questions connexes