2013-04-04 1 views
2

Я изучаю, как использовать NSCopy. Я хочу сделать копию пользовательского объекта, который я использую, который является ImageView в UIScrollView.Использование NSCopy для копирования пользовательского объекта, содержащего указатели?

Я пытаюсь реализовать протокол 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]; 

копия сделана, однако у меня есть одна проблема нечетное. Свойства ImageView (UIImageView) и ImageToShow (UIImage) объекта копируемого объекта выглядят так же, как и исходные объекты. Такой подход имеет смысл, так как в коде копирования я перенаправляю указатель, вместо того, чтобы создавать новую версию ImageView и ImageToShow.

Мой вопрос: как создать копию объекта, содержащего указатели на другие объекты?

Спасибо!

+0

UIImageView и UIImage не соответствуют NSCopying, если вы хотите их скопировать, вы должны реализовать его самостоятельно, в категориях. –

+0

Ах интересно, был ли это ответ - спасибо. – GuybrushThreepwood

ответ

4

UIView не соответствует NSCopying, но это не соответствует NSCoding:

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

Это упорядочивает и затем десериализует объект, который является стандартным способом выполнить глубокую копию в ObjC.


EDIT: См https://stackoverflow.com/a/13664732/97337 для примера общего -clone метода категории, которая использует это.

+0

Создает обаяние в сочетании с категорией на UIImageView и UIImage. Как именно это работает только для моего понимания? – GuybrushThreepwood

+0

Подробнее см. Https://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/Archiving/Archiving.html. 'NSCoding' означает, что объект может быть сериализован (например, Serializable в Java). Таким образом, вы просто сериализуете объект, а затем сразу же десериализуете объект и завершаете его полным копированием. Представления специально сериализуемы, поскольку они хранятся в файлах nib. –