0

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

これをエンコードするにはどうすればよいですか?

4

3 に答える 3

1

NSCodingプロトコルです。NSCodingそのメソッドは、プロトコルに準拠するオブジェクトでのみ使用できます。aCGPathRefはオブジェクトでもないため、NSCodingメソッドは直接機能しません。そのため、このエラーが発生します。

これは、 CGPathをシリアル化する方法を考え出した人です。

于 2012-03-30T08:08:08.217 に答える
1

問題はARCが原因ではなく、CベースのコアグラフィックスコードとObjective-CベースのNSCodingメカニズムの不一致が原因です。

NSCodingエンコーダー/デコーダーを使用するには、Objective-Cプロトコルに準拠したオブジェクトを使用する必要があります。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 

これは私のテストで機能します。

于 2014-05-08T17:35:50.623 に答える
0

CGPathを永続的に保存するように要求する場合は、CGPathApply関数を使用する必要があります。その方法については、こちらを確認してください。

于 2012-03-30T08:08:23.193 に答える