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 = ?
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