2013-07-01 5 views
0

Pourquoi la deuxième ligne de la boucle (celle de a.retainCount) ne va pas planter (en raison d'un mauvais accès)?Pourquoi cela ne plante pas?

NSArray* a0 = @[[NSMutableString stringWithString:@"a"]];  
NSArray * arr = [NSArray arrayWithObject:a0]; 
[a0 release];[a0 release]; 

for (NSArray* a in arr) 
{ 
    //NSLog(@"%d", (a == a0)); 
    NSLog(@"RC: %d", a.retainCount); 
} 

mais il se bloquerait si la première ligne dans la boucle (a == a0 un) n'est pas commentée.

Ce serait certainement tomber en panne lorsque la piscine autorelease est drainée, mais je suis particulièrement poser des questions sur la deuxième ligne en boucle, et non après.

Quelqu'un peut-il expliquer s'il vous plaît?

+0

Pouvez-vous expliquer ce que cela a à voir avec 'xcode'? – Popeye

+2

Est-ce une question de devoirs? Nous ne sommes pas ici pour faire vos devoirs. – Popeye

+0

Pourquoi lâchez-vous l'objet 'a0' quand vous ne le possédez pas? Il n'y a pas de 'alloc',' new' ou 'copy', donc vous êtes sur le relâcher. Cela peut être la raison pour laquelle il se bloque lorsque vous exécutez le journal égal, car il pointe vers une adresse mémoire non valide. – rckoenes

Répondre

5

S'il vous plaît examiner http://www.whentouseretaincount.com/

Envoi d'un message à un objet désalloué est un comportement non défini . Il peut tomber en panne, il peut ne pas.

Dans ce cas, il ne s'écraser parce que la mémoire qui contenait l'objet n'a pas été écrasé par autre chose. Si vous deviez allumer Malloc Scribble, il tomberait en panne. Cet appel à NSLog()par coïncidence provoque la gribouille de la mémoire, provoquant le crash.

retainCount ne peut jamais revenir 0 exactement parce que la messagerie d'un objet désalloué est un comportement non défini. Le système ne prend pas la peine de décrémenter le RC à 0 car l'objet n'est plus viable de toute façon.

Je suis curieux dans quel contexte cette question a été soulevée? Utilisez-vous un didacticiel ou des matériaux de classe qui utilisent retainCount?


Il est pas toujours une erreur de segmentation pour la même raison, le moteur d'exécution ne diminue pas le nombre de conserver à 0; Efficacité.

Pour en faire une erreur de segmentation garanti signifierait perdre quelques cycles d'écriture des valeurs fausses à la mémoire (ou décrémenter le nombre retain).

Comme il est, free() marque simplement la mémoire comme étant disponible pour les futurs malloc() s. Il ne modifie en aucune façon le contenu de la mémoire, d'où le comportement non défini .

+2

+1, je suis tellement content que quelqu'un ait fait ce site ... mais je pense que l'OP a probablement commencé à jouer avec le compte de retenue tout en isolant le bug (en leur donnant le bénéfice du doute.) –

+1

Oh, bien sûr - tout le monde tombe le chemin RC au moins une ou deux fois quand ils sont nouveaux dans l'environnement (et parfois quand ils ne sont pas si nouveaux). Rien de mal à cela et de comprendre pourquoi il est si inutile fournit beaucoup d'informations tangentielles qui sont universellement applicables à d'autres aspects du développement iOS/Cocoa. – bbum

+0

@bbum: l'impression retient le compte n'était pas la vraie chose qui m'intéressait. Le vrai intérêt était pourquoi il ne s'est pas crashé. Peut-être parce que j'avais la théorie que dès que le nombre de retenue d'un objet atteint 0, sa mémoire est renvoyée au système et après l'appel sa méthode * devrait * planter (spécialement si la méthode appelée utilise une variable d'instance). – Sohaib

3

Cela pourrait planter à tout moment. Il est probable que la première ligne de la boucle a déclenché la mémoire au pointeur "a" affecté à d'autres utilisations. Donc, quand "a" est référencé sur la deuxième ligne, tout peut arriver. Si vous activez les options XCode dans "Schéma -> Diagnostics -> Gestion de la mémoire", il se peut qu'il se bloque immédiatement.

+0

Oui. En fait * any * appel NSLog au lieu de 'DLog (@"% d ", (a == a0))' provoque l'écrasement de l'instruction suivante. –

+0

Je viens de remplacer le DLog avec NSLog et vérifié. L'effet est le même. – Sohaib

+0

@Joe Smith: Quelles options voulez-vous dire exactement? – Sohaib