33 votes

ios bridge vs bridge_transfer

Je suis confondu avec bridge et bridge_transfer, est-ce correct?

 -(void)getData{
    ABAddressBookRef addressBook = ABAddressBookCreate();
    NSArray *allPeople = (__bridge_transfer NSArray*)ABAddressBookCopyArrayOfAllPeople(addressBook);

    NSString *name;
    for ( int i = 0; i < [allPeople count]; i++ )
    {
        name = (__bridge_transfer NSString *) ABRecordCopyValue((__bridge ABRecordRef)[allPeople objectAtIndex:i], kABPersonFirstNameProperty);
    }
    CFRelease(addressBook);
    allPeople = nil;
}
 

Y a-t-il quelqu'un qui peut m'expliquer comment les utiliser?

42voto

He Shiming Points 2454

Si vous avez automatique de comptage de références (ARC) est activée, le code est correct.

Il y a deux __bridge_transfer dans vos déclarations. En conséquence, la propriété de créé CFObjects seront transférés à NSObjects. Si vous avez de l'ARC en marche, ils sera libéré automatiquement. Si vous avez utilisé __bridge à la place de ces 2 états, vous aurez besoin d'appeler explicitement CFRelease de libérer CFObjects créé par l' *Copy API.

L' __bridge déclaration est également correcte. Parce que vous êtes le référencement d'un NSObject en CF API. Vous n'êtes pas le transfert de la propriété, de sorte que l'ARC va le libérer.

19voto

Chiquis Points 5891

Il est très très simple, Lorsque vous utilisez l'ARC (automatic reference counting) le compilateur va prendre soin de compter le nombre d'objets se faire remarquer par vos variables. Quand le comte passe à 0, l'objet est automatiquement dealocated. DONC, pour les choses qui viennent à partir d'un faible niveau de la structure, comme le noyau de la fondation, le compilateur ne sait pas quoi faire. Si vous utilisez le PONT, si vous voulez juste pour dire au compilateur "ignorer celui-ci, je le sors quand j'en ai besoin". ou Pont de transfert si vous voulez dire "considérer comme un objet et de le libérer lorsque la référence passe à 0).

En gardant cela à l'esprit, vérifiez votre code, par exemple parce que

Vous dites xcode pour libérer ce lorsque la référence est 0

NSArray *allPeople = (__bridge_transfer NSArray*)ABAddressBookCopyArrayOfAllPeople(addressBook);

Mais ici, vous libérer vous-même.

CFRelease(addressBook);

Je ne me souviens pas très bien mais je pense que cfrelease à néant l'habitude de planter votre programme.

1voto

Tuique Points 49

Luis Oscar Je travaille toujours sur ma compréhension de l'ARC, mais je pense que addressBook a besoin de CFRelease. ARC ne gère pas le carnet d'adresses. NSArray * allPeople est géré par ARC via l'indicateur de cast __bridge_transfer et il est créé en tant que copie de l'original. Sans CFRelease, le carnet d'adresses fuira.

0voto

moliveira Points 139

Une modification: je crois que l'appel de CFRelease sur un objet nul fait planter l'application

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X