【发布时间】:2013-01-29 01:21:05
【问题描述】:
我需要一些关于 iOS 中 __bridge-ing 的建议。
希望下面的 SSCCE1 能比我用文字更好地解释这个问题,但我需要知道如何将 void* 转换为 @987654324 @;应该使用哪个__bridge 变体(参见代码中的注释)。
阅读了不同的桥梁,我推断我需要__bridge_transfer,但随后我在addObject: 上收到了一个 EXC_BAD_ACCESS
最终,在调用CGPathApply 之后,我希望在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);
}
}
1:SSCCE
【问题讨论】:
-
我不明白。我只是按照 Xcode 的建议使用了
__bridge。然后你的程序就编译好了。 -
或者你正在寻找这个,
__bridge在 Objective-C 和 Core Foundation 之间传输一个指针,而不转移所有权。__bridge_retained或CFBridgingRetain将 Objective-C 指针转换为 Core Foundation 指针,并将所有权转移给您。您负责调用 CFRelease 或相关函数来放弃对象的所有权。__bridge_transfer或CFBridgingRelease将非 Objective-C 指针移动到 Objective-C 并将所有权转移给 ARC。 ARC 负责放弃对象的所有权。 -
@BlackFlam3(第 1 条评论)这不仅仅是让代码编译的情况。我需要正确保留内存,以便我可以访问
pathPoints的NSLog -
@BlackFlam3(第 2 条评论)我在另一个网站上读到过,并推断我需要
__bridge_transfer,但随后我在addObject:上收到了 EXC_BAD_ACCESS
标签: ios objective-c memory-management core-graphics cgpath