Глубокое копирование объектов Objective-C с UIImageView в качестве свойства - PullRequest
2 голосов
/ 26 января 2012

У меня есть объект со свойствами NSString, UIImageView и такими простыми переменными, как BOOL, int и float.

Я пытаюсь создать глубокую копию объекта. Для этого я реализовал протокол NSCopying для своего класса и метод copyWithZone, например:

-(id)copyWithZone:(NSZone *)zone
{
    iItem *clone = [[iItem alloc] init];

    //iItem *clone = [super copyWithZone:zone];

    clone.originalTransform = self.originalTransform;
    clone.initialTransform = self.initialTransform;
    clone.originalFrame = self.originalFrame;

    clone.zOrder = self.zOrder;
    clone.itemId = self.itemId;
    clone.itemIdColor = self.itemIdColor;
    clone.itemIdTexture = self.itemIdTexture;
    clone.itemIdStyle = self.itemIdStyle;
    clone.textureLevel = self.textureLevel;
    clone.currentSizePercent = self.currentSizePercent;
    clone.holdItem = self.holdItem;
    clone.isInverted = self.isInverted;
    clone.delegate = self.delegate;
    clone.mergedFrame = self.mergedFrame;

    clone.selectedMergeView = [self.selectedMergeView copy];

    clone.ScaleFactorScreen = self.ScaleFactorScreen;

    clone.selectedFrameView = [self.selectedFrameView copy];
    clone.selectedFrame = [self.selectedFrame copy];
    clone.frameBeforeMovement = self.frameBeforeMovement;

    //clone.touchBeginPoints = CFDictionaryCreateMutable(NULL, 0, NULL, NULL);
    clone.touchBeginPoints = CFDictionaryCreateMutableCopy(NULL, 0, self.touchBeginPoints);

    clone.contentMode = UIViewContentModeScaleAspectFit;
    clone.animationImages = self.animationImages;
    clone.image = [self.image copy];
    clone.animationDuration = self.animationDuration;
    clone.animationRepeatCount = self.animationRepeatCount;
    [clone startAnimating];


    clone.transform = self.transform;

    clone.frame = self.frame;

    clone.userInteractionEnabled = YES;
    clone.multipleTouchEnabled = YES;

    return clone;
}

Класс iItem наследуется от класса UIImageView, поэтому я попытался вызвать super copyWithZone, но получаю ошибку. А для объектов UIImageView, которые я пытаюсь клонировать, я получаю сообщение SIGABRT '- [UIImageView copyWithZone:]: нераспознанный селектор, отправленный экземпляру 0x210f50'.

Как я могу сделать глубокую копию объекта, который имеет UIImageViews, NSString и простые переменные?

Ответы [ 3 ]

0 голосов
/ 26 января 2012

Самый простой способ - архивировать с помощью NSKeyedArchiver и разархивировать в NSKeyedUnarchiver, если ваши объекты соответствуют NSCoder

0 голосов
/ 18 декабря 2013

Сначала начните с этого

iItem *clone =[[iItem allocWithZone:zone ] init];
0 голосов
/ 26 января 2012

Я думаю, что вы все делаете правильно, выполняете селектор копирования для объектов, которые реализуют NSCopying, и вручную устанавливаете свойства (как вы сделали для изображения, режима содержимого и т. Д.) Для тех, которые этого не делают.

...