Кодировать и декодировать CGMutablePathRef с ARC - PullRequest
0 голосов
/ 30 марта 2012

Под ARC, возможно ли кодировать / декодировать 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

Что я могу сделать, чтобы закодировать это?

Ответы [ 3 ]

1 голос
/ 08 мая 2014

Ваша проблема не в 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 

Это работает в моих тестах.

1 голос
/ 30 марта 2012

NSCoding - это протокол. Его методы могут использоваться только с объектами, которые соответствуют протоколу NSCoding. CGPathRef даже не объект, поэтому NSCoding методы не будут работать напрямую. Вот почему вы получаете эту ошибку.

Вот парень , который придумал способ сериализации CGPaths.

0 голосов
/ 30 марта 2012

Если вы постоянно запрашиваете сохранение CGPath, вам следует использовать функцию CGPathApply. Проверьте здесь , как это сделать.

...