使用ARC对CGMutablePathRef进行编码和解码
在ARC下,是否可以使用NSCoding
对CGMutablePathRef
(或其不可变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
协议的NSCoding
。 CGMutablePathRef
不符合,因为它不是一个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函数。 在这里检查如何做到这一点。