2

したがって、Objective-C のカテゴリを使用して、サブクラス化を必要とせずにメソッドをクラスに追加できることを理解しています。また、これらのカテゴリを使用してインスタンス変数をクラスに追加できないことも理解しています。

インスタンス変数の追加に使用できるクラス拡張機能について少し読みましたが、クラス拡張機能を使用して NSData などの既存のクラスを変更する方法がわかりません。

私の問題は次のとおりです。

NSURL と NSData を含むコア データ モデルがあります。NSData は、NSURL のデータを表示します。ビューでデータを表示する必要がある場合、次のチェックを行います。 --- [NSData バイト] > 0 の場合、NSData を表示します。--- それ以外の場合は、NSURL でデータをフェッチし、返されたときにデータを表示します

十分に単純です。ただし、NSURL が更新されると問題が発生します。したがって、NSURL パスを新しい画像で変更すると、[NSData バイト] が既に 0 より大きいため、新しい画像を取得するための追加の呼び出しは行いません。

私がやりたいことは、データの取得元に関する情報を保持する URLKey というインスタンス変数を NSData に追加することです。CoreData を使用しているため、NSData をサブクラス化できません。

これに対する簡単な解決策を知っている人はいますか?おそらく、クラス拡張についての私の理解にギャップがあるか、単純な方法がないだけかもしれません。

4

1 に答える 1

2

クラス拡張機能は、自分で実装するクラスで、ivars と一部のプロパティをヘッダー ファイルから隠しておく方法として使用する必要があります。これには、クラスの外部で表示する必要があるものだけを含める必要があります (そして、ivars はそのようなものではありません)。

カテゴリは、機能を追加する方法として、既に実装されているクラスで使用されます。これらは通常、既知のクラスに一般的な種類の動作を追加する場合に必要です。たとえば、メソッドを NSString +(NSString*)reversedString に追加します。逆のインスタンスを返すので、次のように使用できます。

NSString *someString = @"string";
NSString *reverse = [someString reversedString]; 
NSLog(@"%@", someString); //this would output "gnirts"

.

特定の問題に関しては、CoreDataModel に NSURL または NSData が含まれていないことを保証できます。サポートされている型は、プリミティブ、文字列、バイナリ データ、および変換可能型です。したがって、必要に応じて、NSData または NSURL をサブクラス化し、タイプを「変換可能」に設定して CoreData で使用できます。これを行った後、必要に応じて NSData をサブクラス化し、その過程でクラス拡張を使用するか、単にカテゴリを使用して必要なメソッドをクラスに追加できます。

変換可能な属性に関する Apple からの引用:

変換可能な属性の背後にある考え方は、非標準型として属性にアクセスするというものですが、背後でコア データは NSValueTransformer のインスタンスを使用して、属性を NSData のインスタンスとの間で変換します。その後、Core Data はデータ インスタンスを永続ストアに保存します。

于 2012-01-26T15:34:02.770 に答える