Où et comment __pont

J'ai besoin de quelques conseils sur __bridge-ing dans iOS.

J'espère que la SSCCE1 ci-dessous va vous expliquer le problème mieux que je peux dans les mots, mais j'ai besoin de savoir comment je peux convertir un void* à un NSMutableArray*; qui __bridge la variation doit être utilisé (Voir le commentaire dans le code).

Lu sur les différents ponts, j'en ai déduit que j'aurais besoin de __bridge_transfer mais puis-je recevoir un EXC_BAD_ACCESS sur addObject:

En fin de compte, j'aimerais avoir un tableau de la CGPoints dans le CGPath après CGPathApply a été appelé.

#import <Foundation/Foundation.h>

void _processPathElement(void* info, const CGPathElement* element)
{
    NSMutableArray *array = (/* WHAT BRIDGE HERE */ NSMutableArray*) info;
    switch (element->type)
    {
        case kCGPathElementMoveToPoint:
        case kCGPathElementAddLineToPoint:
        {
            CGPoint point = element->points[0];
            [array addObject:[NSValue valueWithCGPoint:point]];
            break;
        }
        default:
            break;
    }
}

int main(int argc, char *argv[])
{
    @autoreleasepool
    {
        //Create path
        CGMutablePathRef path = CGPathCreateMutable();
        CGPathMoveToPoint(   path, NULL, 0, 0);
        CGPathAddLineToPoint(path, NULL, 1, 0);
        CGPathAddLineToPoint(path, NULL, 1, 1);
        CGPathAddLineToPoint(path, NULL, 0, 1);
        CGPathCloseSubpath(path);

        NSMutableArray *pathPoints = [NSMutableArray array];
        CGPathApply(path, &pathPoints, _processPathElement);

        NSLog(@"Points:%@", pathPoints);
    }
}


1: SSCCE

  • Je ne comprends pas. J'ai simplement utilisé __bridge comme suggéré par Xcode. Et votre programme compile.
  • Ou vous êtes à la recherche pour cela, __bridge transferts d'un pointeur entre Objective-C et le Fondement de Base avec aucun transfert de propriété. __bridge_retained ou CFBridgingRetain jette un Objectif-C pointeur vers un Fondement de Base de pointeur et aussi des transferts de propriété pour vous. Vous êtes responsable de l'appel CFRelease ou une fonction liée à renoncer à la propriété de l'objet. __bridge_transfer ou CFBridgingRelease se déplace d'une non-Objective-C pointeur à l'Objective-C et aussi en transfère la propriété à l'ARC. L'ARC est responsable de renoncer à la propriété de l'objet.
  • le commentaire) Il n'est pas juste une affaire d'obtenir le code à compiler. J'ai besoin de la mémoire pour être correctement maintenu de sorte que j'ai accès à pathPoints pour la NSLog
  • commentaire) j'ai lu que sur un autre site, et en déduit que j'aurais besoin de __bridge_transfer mais puis-je recevoir un EXC_BAD_ACCESS sur addObject: