Форум программистов, компьютерный форум CyberForum.ru

Глубокое копирование - Программирование iOS/iPhone

Восстановить пароль Регистрация
 
residentkms
21 / 21 / 8
Регистрация: 20.10.2013
Сообщений: 138
Завершенные тесты: 1
09.05.2014, 18:14     Глубокое копирование #1
Суть проста. Нужно скопировать массив ,включая вложенные массивы и объекты. Реализовать то реализовал. Да вот только смущает меня подобный метод реализации. Проперти пришлось задавать посредством геттеров и сеттеров, по скольку при копировании методом copy (newTile = [[Tile alloc]initWithTile:[tiles[i][j] copy]];) приложение вываливалось. Кто что скажет?
Objective-C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
NSMutableArray *tiles;
NSMutableArray *lastStep;
NSNull *noTile;
........
//Копирование
    lastStep = [[NSMutableArray alloc]init];
    for (int j = 0; j < 5; j++) {
        NSMutableArray *subarray = [[NSMutableArray alloc]init];
        for (int i = 0; i < 5; i++) {
            if ([self validTileX:i  andY:j]) {
                Tile *newTile = [[Tile alloc]init];
                Tile *oldTile = [[Tile alloc]initWithTile:tiles[i][j]];
                newTile.position = oldTile.position;
                newTile.value = oldTile.value;
                [newTile updateValue];
                [subarray addObject:newTile];
            }else{
                [subarray addObject:noTile];
            }
        }
        [lastStep addObject:subarray];
    }
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.05.2014, 18:14     Глубокое копирование
Посмотрите здесь:

Классика - глубокое проникновение
Python Как выполнять глубокое копирование объектов?
C (СИ) Копирование одного текстового файла в другой, используя посимвольное, построчное и поблочное копирование
Копирование объектов Objective-C
Java SE Глубокое клонирование объекта, содержащий массив объектов
Глубокое копирование пользовательского элемента управления C#
VBA Excel. Копирование столбца, при заполнении 22-й строки продолжить копирование в соседний столбец
Более глубокое изучение php, куда двигаться? PHP ООП
Копирование определенного текста из файла, копирование и вставка в статичную переменную C#
C# Глубокое копирование объектов с интерфейсами
JavaScript Глубокое клонирование объектов не работает
Глубокое изучение NET CLR .NET

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
zulkis
 Аватар для zulkis
681 / 608 / 38
Регистрация: 13.01.2011
Сообщений: 1,724
09.05.2014, 18:22     Глубокое копирование #2
Для того, чтобы при посылке сообщения -copy приложение не "вываливалось", нужно чтобы класс поддерживал этот метод.
Objective-C
1
- (void)copy;
Это метод у NSObject класса.
Из документации:
This is a convenience method for classes that adopt the NSCopying protocol. An exception is raised if there is no implementation for copyWithZone:.
Метод
Objective-C
1
- (id)copyWithZone:(NSZone *)zone;
это метод протокола NSCopying. Его и смотрите.
Разберитесь как реализовывать его для стороннего класса(допустим вашего Tile) и пользуйтесь.
Например так:
Objective-C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@interface Tile : NSObject <NSCopying>
 
@property (nonatomic, copy) NSString *property1;
@property (nonatomic) NSUInteger property2;
 
@end
 
@implementation Tile
 
- (id)copyWithZone:(NSZone *)zone {
    Tile *obj = [Tile new];
    obj.property1 = self.property1;
    obj.property2 = self.property2;
    return obj;
}
 
@end
residentkms
21 / 21 / 8
Регистрация: 20.10.2013
Сообщений: 138
Завершенные тесты: 1
09.05.2014, 18:43  [ТС]     Глубокое копирование #3
Спасибо, а есть ли метод, позволяющий осуществить глубокое копирование без перебора массива?
Я находил что то вроде про NSDeepCopying, но реализовать с ним ничего не получилось, поскольку была какая то ошибка.
zulkis
 Аватар для zulkis
681 / 608 / 38
Регистрация: 13.01.2011
Сообщений: 1,724
10.05.2014, 12:56     Глубокое копирование #4
residentkms, NSDeepCopying - нет такого.
Только если сами реализуете...

По этой ссылке вы можете найти то, что вам возможно пригодится:
If you need a true deep copy, such as when you have an array of arrays, you can archive and then unarchive the collection, provided the contents all conform to the NSCoding protocol. An example of this technique is shown in Listing 3.

Listing 3 A true deep copy

NSArray* trueDeepCopyArray = [NSKeyedUnarchiver unarchiveObjectWithData:
[NSKeyedArchiver archivedDataWithRootObject:oldArray]];
residentkms
21 / 21 / 8
Регистрация: 20.10.2013
Сообщений: 138
Завершенные тесты: 1
10.05.2014, 12:58  [ТС]     Глубокое копирование #5
Цитата Сообщение от zulkis Посмотреть сообщение
residentkms, NSDeepCopying - нет такого.
Только если сами реализуете...
По этой ссылке вы можете найти то, что вам возможно пригодится:
If you need a true deep copy, such as when you have an array of arrays, you can archive and then unarchive the collection, provided the contents all conform to the NSCoding protocol. An example of this technique is shown in Listing 3.
Listing 3 A true deep copy
NSArray* trueDeepCopyArray = [NSKeyedUnarchiver unarchiveObjectWithData:
[NSKeyedArchiver archivedDataWithRootObject:oldArray]];
Вот именно это я и находил. Но возникала ошибка, связанная с NSCoder.
zulkis
 Аватар для zulkis
681 / 608 / 38
Регистрация: 13.01.2011
Сообщений: 1,724
10.05.2014, 13:07     Глубокое копирование #6
Цитата Сообщение от residentkms Посмотреть сообщение
Вот именно это я и находил. Но возникала ошибка, связанная с NSCoder.
Ну так методы из протокола нужно реализовать, как написано ...
provided the contents all conform to the NSCoding protocol
Yandex
Объявления
10.05.2014, 13:07     Глубокое копирование
Ответ Создать тему
Опции темы

Текущее время: 15:19. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru