使用ARC对CGMutablePathRef进行编码和解码

在ARC下,是否可以使用NSCodingCGMutablePathRef (或其不可变forms)进行编码/解码? 天真地我尝试:

 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 

我能做些什么来编码?

NSCoding是一个协议。 它的方法只能用于符合NSCoding协议的NSCoding 。 一个CGPathRef甚至不是一个对象,所以NSCoding方法不会直接工作。 这就是为什么你得到这个错误。

这里有一个人想出了一个序列化CGPaths的方法。

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

要使用编码器/解码器,您需要使用符合Objective-C NSCoding协议的NSCodingCGMutablePathRef不符合,因为它不是一个Objective-C对象,而是一个核心graphics对象引用。

但是, UIBezierPath是一个UIBezierPath的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 

这在我的testing中起作用。

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