0

在 ARC 下,是否可以使用 对 a CGMutablePathRef(或其非可变形式)进行编码/解码NSCoding?我天真地尝试:

path = CGPathCreateMutable();
...
[aCoder encodeObject:path]

但我从编译器得到一个友好的错误:

Automatic Reference Counting Issue: Implicit conversion of an Objective-C pointer to 'CGMutablePathRef' (aka 'struct CGPath *') is disallowed with ARC

我该怎么做才能对此进行编码?

4

3 回答 3

1

您的问题不是由于 ARC,而是基于 C 的核心图形代码与基于 Objective-C 的 NSCoding 机制之间的不匹配。

要使用编码器/解码器,您需要使用符合 Objective-CNSCoding协议的对象。CGMutablePathRef不符合,因为它不是一个 Objective-C 对象,而是一个 Core Graphics 对象引用。

但是,UIBezierPath它是一个 CGPath 的 Objective-C 包装器,它确实符合。

您可以执行以下操作:

CGMutablePathRef mutablePath = CGPathCreateMutable();
// ... you own mutablePath. mutate it here...
CGPathRef persistentPath = CGPathCreateCopy(mutablePath);
UIBezierPath * bezierPath = [UIBezierPath bezierPathWithCGPath:persistentPath];
CGPathRelease(persistentPath);
[aCoder encodeObject:bezierPath];

然后解码:

UIBezierPath * bezierPath = [aCoder decodeObject];
if (!bezierPath) { 
  // workaround an issue, where empty paths decode as nil
  bezierPath = [UIBezierPath bezierPath]; 
}
CGPathRef  path = [bezierPath CGPath];
CGMutablePathRef * mutablePath = CGPathCreateMutableCopy(path);
// ... you own mutablePath. mutate it here 

这在我的测试中有效。

于 2014-05-08T17:35:50.623 回答
1

NSCoding是一个协议。它的方法只能用于符合NSCoding协议的对象。aCGPathRef甚至不是一个对象,所以NSCoding方法不能直接工作。这就是您收到该错误的原因。

这是一个想出一种序列化CGPaths的方法的人。

于 2012-03-30T08:08:08.217 回答
0

如果您要求永久存储 CGPath,您应该使用 CGPathApply 函数。在这里查看如何做到这一点。

于 2012-03-30T08:08:23.193 回答