Maison > Questions et réponses > le corps du texte
我不是很明白其中“nsmutablearray类对象被赋值给变量obj,但obj自己并不持有该对象,使用retain可以持有该对象”这句话。
然后我在网上看到这个,应该是对应“非自己生成的对象,自己也能持有”这个情况,然后我写了下面的代码
NSMutableArray *array = [NSMutableArray arrayWithObjects: @"one", @"two", nil];
NSString *elem = array[0];
[array removeAllObjects];
NSLog(@"%@", elem);
既然removeallobjects了就应该被dealloc了,为什么还能打印出elem呢?
还有第二种代码,person被release之后为什么还可以访问name
People *person = [[People alloc] init];
[person release];
NSString *name = person.name;
NSLog(@"%@", name);
巴扎黑2017-04-17 17:55:18
Il s'agit d'un problème avec le mécanisme de comptage de références. En termes simples, lorsqu'un objet est initialisé via une allocation, une copie, etc., son retentionCount deviendra 1. Chaque fois qu'il est conservé, retentionCount augmente de 1, et à chaque fois il est libéré, containCount Soustraire 1. Lorsque l'objet est ajouté à la collection (comme un tableau), il sera automatiquement conservé une fois, et lorsqu'il sera supprimé de la collection, il sera automatiquement libéré. Lorsque le holdCount de l'objet devient 0, l'objet est marqué comme libre. En principe, l'objet ne doit plus être accessible à ce moment-là, car il peut être libéré à tout moment.
"Les objets qui ne sont pas générés par vous-même peuvent également être détenus par vous-même" signifie que même si un objet n'est pas généré par vous-même, vous pouvez le conserver, donc son retentionCount est augmenté de 1. S'il n'y a pas de libération excessive ailleurs, in Avant de le libérer, son retentionCount est au moins égal à 1, ce qui équivaut à si vous le teniez.
Vos deux derniers problèmes sont que votre code de test utilise le mauvais objet. NSString ne suit pas la méthode retention/release. Vous pouvez remplacer tous les NSString de votre test par NSMutableString ou n'importe quel objet ObjectA.
La dernière question est que retentionCount devrait être 0 après la libération de la personne. Pourquoi puis-je toujours accéder à person.name ? La raison en est que l'objet pointé par le pointeur de personne ne sera pas effacé immédiatement après que son containCount ait atteint 0. Il faudra peut-être attendre la prochaine boucle d'exécution. À ce moment, le pointeur de personne pointe toujours vers cet objet et le nom est un. NSString, afin qu'il soit accessible.