Ios 桥在哪里,怎么走

Ios 桥在哪里,怎么走,ios,objective-c,memory-management,core-graphics,cgpath,Ios,Objective C,Memory Management,Core Graphics,Cgpath,我需要一些关于iOS中桥接的建议 希望下面的SSCCE1能更好地解释这个问题,但我需要知道如何将void*转换为NSMutableArray*;应使用哪一种\u桥变体(参见代码中的注释) 通过阅读不同的网桥,我推断我需要网桥传输,但随后我在addObject: 最后,我希望在调用cgpathpapply之后,在CGPath中有一个CGPoints数组 #import <Foundation/Foundation.h> void _processPathElement(void* i

我需要一些关于iOS中桥接的建议

希望下面的SSCCE1能更好地解释这个问题,但我需要知道如何将
void*
转换为
NSMutableArray*
;应使用哪一种
\u桥
变体(参见代码中的注释)

通过阅读不同的网桥,我推断我需要
网桥传输
,但随后我在
addObject:

最后,我希望在调用
cgpathpapply
之后,在
CGPath
中有一个
CGPoints
数组

#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);
    }
}
#导入
void _processPathElement(void*info,const CGPathElement*element)
{
NSMutableArray*数组=(/*此处的桥接器*/NSMutableArray*)信息;
开关(元件->类型)
{
案例kCGPathElementMoveToPoint:
案例KCGPATHELEMENTADLINETOPOINT:
{
CGPoint点=元素->点[0];
[array addObject:[NSValue valueWithCGPoint:point]];
打破
}
违约:
打破
}
}
int main(int argc,char*argv[])
{
@自动释放池
{
//创建路径
CGMutablePathRef path=CGPathCreateMutable();
CGPathMoveToPoint(路径,NULL,0,0);
CGPathAddLineToPoint(路径,NULL,1,0);
CGPathAddLineToPoint(路径,NULL,1,1);
CGPathAddLineToPoint(路径,NULL,0,1);
CGPathCloseSubpath(路径);
NSMutableArray*路径点=[NSMutableArray];
CGPathApply(路径和路径点,_processPathElement);
NSLog(@“点:%@”,路径点);
}
}
1:

我不确定为什么会这样,但我发现解决方案是:

NSMutableArray *array = (__bridge NSMutableArray*) info;

//AND

CGPathApply(path, (__bridge void*)pathPoints, _processPathElement);

如果有人能解释为什么这样做,并确认没有(/有)任何内存泄漏,我将非常感激关于使用bridge关键字的文档。具体而言,我想指出§3.2.4:

(uu-bridge T)op
将操作数强制转换为目标类型T。如果T是可保留的对象指针类型,则op必须具有不可保留的指针类型。如果T是不可保留的指针类型,则op必须具有可保留的对象指针类型。否则,演员阵容就不好。没有所有权转让,圆弧插入也没有保留操作

(\uuu bridge\u reserved T)op
将必须具有可保留对象指针类型的操作数强制转换为目标类型,目标类型必须是不可保留指针类型。ARC保留该值,但要遵循通常对局部值的优化,接收者负责平衡+1

(\uuuu bridge\u transfer T)op
将必须具有不可保留指针类型的操作数强制转换为必须是可保留对象指针类型的目标类型。ARC将在封闭的完整表达式的末尾释放该值,并对局部值进行常规优化

传入的指针(
void*
)是不可保留的指针类型,而NSMutableArray是可保留的指针类型。这就排除了直接保留的桥。所以问题是,到
\uuu桥
还是到
\uu桥
传输

\uuuuu bridge\u transfer
通常用于从返回已保留的CF对象的方法中获取Objective-C指针。例如,CFStringCreateWithFormat将返回一个保留的CFString,但如果您想从中获得一个NSString,则需要在它们之间进行
\uu桥接\u传输
。这将使ARC在适当时释放CF保留的对象。例如,
NSString*str=(\uuuuu-bridge\u-transfer-NSString*)CFStringCreateWithFormat(…)

您的代码没有这样做,您不需要干预所有权。您的main方法控制着它的内存管理,并且只传递一个对它调用的方法的引用(虽然是间接的,但都在main的范围内)。因此,您可以使用
\u桥

但是等等,当我使用_桥时,我的代码会出现内存访问错误

啊,这是您发布的代码的问题,与整个桥接讨论无关。您需要将一个
void*
传递给CGApplyPath,用于处理函数
\u processPathElement
。您传递的是
NSMutableArray**

当您重铸到
NSMutableArray*
时,实际上是在铸造一个
NSMutableArray**
。这将导致臭名昭著的EXC\u访问错误。您需要传递指针本身,而不是指向指针的指针
CGPathApply(路径,路径点,_processPathElement)
将不起作用,您不能将
NSMutableArray*
作为
void*
传递。讽刺的是,你需要的是一座桥。出于与以前相同的原因,您只需要
\u桥
。请参见下面的代码,安装正确的桥接器,并按预期工作:

#import <UIKit/UIKit.h>
#import <Foundation/Foundation.h>

void _processPathElement(void* info, const CGPathElement* element)
{
    NSMutableArray *array = (__bridge 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 alloc] init];
        CGPathApply(path, (__bridge void*)pathPoints, _processPathElement);
        
        NSLog(@"Points:%@", pathPoints);
    }
}

我不明白。我只是按照Xcode的建议使用了
\uuu桥
。你的程序编译。或者你正在寻找这个东西,<代码>π桥接器>代码>在Objut-C和Core基金会之间传递一个指针,没有所有权的转移。代码> {桥}保留< <代码>或<代码> CFBridgingRetain < /代码>将一个ObjuleC指针指向一个核心基础指针,并将所有权转移给您。您负责调用CFRelease或相关函数以放弃对象的所有权<代码>\uuu桥接\u传输
CfBridgegRelease
将非Objective-C指针移动到Objective-C,并将所有权转移到ARC。ARC负责放弃对象的所有权。@BlackFlam3(第一条注释)。这不仅仅是让代码编译的情况。我需要正确保留内存,以便能够访问
NSLog
@BlackFlam3(第二条注释)的
pathPoints
Points:(
    "NSPoint: {0, 0}",
    "NSPoint: {1, 0}",
    "NSPoint: {1, 1}",
    "NSPoint: {0, 1}"
)