0

名前と写真のみのContactオブジェクトがあるとします。

@interface Contact: NSObject
{
    NSString *name;
    UIImage *photo;
}
@property (copy) NSString name;
@property (copy) UIImage photo;

さらに、私がサムと呼ばれる1000人の人々がいる場所に住んでいて、それらはすべてクローンであるため、彼らの写真はまったく同じに見え、私はそれらすべてに同じ写真をだまして使用することにしました。

Objective Cは、名前と写真のコピーが取られたときに、同じ値を認識し、1つのオブジェクトで処理でき、すべてのSamに1つのNSStringと1つのUIImageを割り当てることができるほど賢いですか?

これを処理する正しい方法は何ですか?明らかに、Sam以外のケースを処理するために、また可変の文字列と画像が渡された場合に備えて、それらにプロパティをコピーさせる必要があります。

4

2 に答える 2

1

UIImageNSCopyingプロトコルに準拠していないため、質問はかなり議論の余地があります。プロパティcopyのそれをに変更する必要があります。とにかく変更可能ではない(そして変更可能なサブクラスがない)ので、これは完全に問題ありません。したがって、コピーする必要はありません。photoretainUIImage

-copy名前に関しては、 (コピーをサポートする)不変オブジェクトを呼び出すと、オブジェクトをコピーするのではなく、単に保持する傾向があります。これらのオブジェクトの可変バリアント(たとえばNSMutableString)でそれを呼び出すと、不変のコピーが生成されます(それ自体-copyが保持することで後続の要求に応答します)。ただし、-copy可変オブジェクトを複数回呼び出すと、別個の不変コピーが生成されることに注意してください。

于 2012-03-08T01:13:07.960 に答える
0

[UIImage imageNamed:]を使用すると、SDKが写真をキャッシュして再利用します。また、UIImageは不変であるため、メモリにロードされた後で実際に変更することはできません。

イメージオブジェクトは不変であるため、作成後にプロパティを変更することはできません。これは、通常、初期化時に画像のプロパティを指定するか、画像のメタデータに依存してプロパティ値を提供することを意味します。

ContactをNSCopyingに準拠させる場合は、オブジェクトを複製するときにNSStringでcopyを使用するようにしてください。

于 2012-03-08T01:16:35.633 に答える