您的问题不是由于 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
这在我的测试中有效。