Ваша проблема не в ARC, а в несоответствии между кодом Core Graphics, основанным на C, и механизмом NSCoding, основанным на Objective-C.
Чтобы использовать кодеры / декодеры, вам нужно использовать объекты, которые соответствуют протоколу Objective-C NSCoding
. CGMutablePathRef
не соответствует, так как это не объект Objective-C, а ссылка на объект Core Graphics.
Однако UIBezierPath
- это оболочка Objective-C для CGPath, и она соответствует.
Вы можете сделать следующее:
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
Это работает в моих тестах.