8
votes

Quel est le rôle de la "copie" dans l'arc

Quel est le rôle de mot-clé copier code> dans l'arc

i trouver la copie code> (mot-clé) peut être utilisé en arc tandis que conserver code > et version code> ne peut pas être utilisé. De plus, le rôle de copier code> dans arc est identique au rôle de copier code> en mrc.? Si oui, est-ce que copie code> fait le retentaincount code> +1 dans arc? P>

et j'ai vu Mike Ash Blog sur Arche dit: P>

Vous devez copier explicitement des blocs que vous passez en tant que paramètres d'identification: Â P> blockquote> xxx pré>

mais quand je teste le code comme celui-ci (sans utiliser copier code>) il fonctionne aussi aussi. P>

NSArray *array = [[NSArray alloc] initWithObjects:^{NSLog(@"hahaha");}, nil];

[self test:[array objectAtIndex:0]];

- (void)test:(void (^)(void))completion
{
        completion();
}


4 commentaires

Le nombre de retenue n'augmente pas en utilisant la copie en MRC ou en arc.


@rakech plus précis de dire "le compte de conserver pourrait être augmenté en arc / mrr", car il s'agit d'un détail de mise en œuvre. Pour NsmutableString? Vous obtenez une copie. Pour Nstring? Bumps Le retenue compte par un et renvoie le même objet.


Notez que le bloc de votre exemple est probablement un bloc statique et votre code peut donc «travailler» par coïncidence uniquement.


@bbum: vrai. Mais ce que j'essayais de dire était intrinsèquement copie ne provoque pas d'augmentation de comptage de retenue. L'OP semble avoir supposé que.


3 Réponses :


1
votes

Lorsque vous utilisez copier en arc, il fait la même chose que sans arc, c'est-à-dire qu'il crée une copie de l'objet qui reçoit la copie (elle crée une nouvelle instance d'objet en mémoire) et Crée un relation forte à l'objet qui exécute le code.
Cela signifie que la copie de l'objet a maintenant une retenue compte de 1, mais cela ne concerne aucune pertinence pour vous dans l'arc, car cela est traité automatiquement.


0 commentaires

4
votes

Copie fait exactement ce que le nom implique. Il renvoie une copie de l'objet. Dites que vous avez un objet mutable et que vous avez un pointeur. Vous vous y référez ensuite ailleurs dans le code et ARC supposera que vous souhaitez pointer sur le même objet et la conserver pour vous. Dans ce cas, si vous modifiez l'une d'entre elles, les deux refléteront les modifications. Si vous le pointiez avec un copier , vous obtiendrez un nouvel objet et que la modification d'une modification de l'autre n'affectera pas l'autre: xxx

dans les documents ici:

http://developer.apple.com/library/ios/#documentation/cocoa/conceptual/blocks/articles/bxvariables.html#//apple_ref/doc/uid/tp40007502-ch6-sw1

Il mentionne que lorsque des blocs sont copiés, tous leurs objets de l'objectif-C reçoivent une référence forte de manière à ne pas abandonner hors de portée avant que le bloc ne soit exécuté. < / p>


0 commentaires

6
votes

Oui, le rôle de copier en arc est identique au rôle de copier dans mrr

La copie invoquera la méthode copywithzone: . Lors de son envoi à l'objet mutable, il retournera un objet immuable clone, qui retentitCount est 1. Lorsqu'il est envoyé à l'objet immuable, il ne copiera pas, il retournera l'objet lui-même, mais le retenuCount +1.

Ainsi, lorsque vous utilisez une copie dans arc, vous pouvez utiliser comme ceci: objet1 = [objet2 copie]; arc gérera le retenuCompte de la objet1 , quand alors < Code> Object1 est publié par arc, l'objet Object2 S sera un changement correspondant. Donc, vous ne vous inquiétez pas de la mémoire.

À propos du bloc doit être copier lorsque vous passez comme ID paramètres.

the document Apple dit:

Typiquement, vous ne devriez pas avoir besoin de copier (ou de conserver) un bloc. Toi seulement besoin de faire une copie lorsque vous vous attendez à ce que le bloc soit utilisé après destruction de la portée dans laquelle il a été déclaré. La copie déplace un Bloquer au tas

et comme UGHOAVGFHW dit :

Les blocs sont similaires aux autres objets pour la gestion de la mémoire, mais pas le même. Lorsqu'un bloc qui accède aux variables locales est créé, il est créé sur la pile. Cela signifie qu'il n'est valable que tant que sa la portée existe. Pour enregistrer ce bloc pour plus tard, vous devez le copier, lequel la copie au tas


0 commentaires