2

NSCopy の使い方を学んでいます。UIScrollView の ImageView である、使用しているカスタム オブジェクトのコピーを作成したいと考えています。

次のように NSCopying プロトコルを実装しようとしています。

-(id)copyWithZone:(NSZone *)zone
{
    ImageView *another = [[ImageView allocWithZone:zone]init];

    another.imageView = self.imageView;
    another.imageToShow = self.imageToShow;
    another.currentOrientation = self.currentOrientation;
    another.portraitEnlarge = self.portraitEnlarge;
    another.landscapeEnlarge = self.landscapeEnlarge;
    another.originalFrame = self.originalFrame;
    another.isZoomed = self.isZoomed;
    another.shouldEnlarge = self.shouldEnlarge;
    another.shouldReduce = self.shouldReduce;
    another.frame = self.frame;
    //another.delegate = another;
    another.isZoomed = NO;

    [another addSubview:another.imageView];

    return another;
}

次に、オブジェクトを別のクラスにコピーします。

ImageView * onePre = [pictureArray objectAtIndex:0];
ImageView * one = [onePre copy];

コピーは作成されますが、奇妙な問題が 1 つあります。コピーされたオブジェクトの ImageView (UIImageView) および ImageToShow (UIImage) プロパティは、元のオブジェクトと同じように見えます。この種のコピー コードは、ImageView と ImageToShow の新しいバージョンを作成するのではなく、ポインターを再指定しているため、理にかなっています。

私の質問は、他のオブジェクトへのポインターを含むオブジェクトのコピーを作成するにはどうすればよいですか?

ありがとう !

4

1 に答える 1

4

UIViewには準拠していませんNSCopyingが、には準拠していNSCodingます:

another.imageView = [NSKeyedUnarchiver unarchiveObjectWithData:
                      [NSKeyedArchiver archivedDataWithRootObject:self.imageView]];

これにより、オブジェクトがシリアル化されてから逆シリアル化されます。これは、ObjC でディープ コピーを実行する標準的な方法です。


編集:これを使用する一般的なカテゴリ メソッドの例については、https ://stackoverflow.com/a/13664732/97337 を参照してください。-clone

于 2013-04-04T12:39:07.030 に答える