Форум программистов, компьютерный форум, киберфорум
Наши страницы
Программирование iOS/iPhone
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
residentkms
21 / 21 / 8
Регистрация: 20.10.2013
Сообщений: 138
Завершенные тесты: 1
1

Глубокое копирование

09.05.2014, 18:14. Просмотров 1000. Ответов 5
Метки нет (Все метки)

Суть проста. Нужно скопировать массив ,включая вложенные массивы и объекты. Реализовать то реализовал. Да вот только смущает меня подобный метод реализации. Проперти пришлось задавать посредством геттеров и сеттеров, по скольку при копировании методом 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];
    }
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.05.2014, 18:14
Ответы с готовыми решениями:

Копирование объектов
Добрый день! Обнаружил, что я не понимаю каких-то очень базовых вещей. Был...

Глубокое копирование объектов с интерфейсами
Подскажите пожалуйста, если класс наследует интерфейсы, то как реализовать его...

Глубокое копирование пользовательского элемента управления
Здравствуйте! Ну вопрос практически описан в шапке. Есть пользовательский...

Как выполнять глубокое копирование объектов?
Вообщем возникла проблема при копирование объектов. Перешёл с С++ на питон....

Глубокое изучение NET CLR
Всем привет! Поделитесь книгами или ресурсами с актуальной информацией о...

5
zulkis
684 / 611 / 43
Регистрация: 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
1
residentkms
21 / 21 / 8
Регистрация: 20.10.2013
Сообщений: 138
Завершенные тесты: 1
09.05.2014, 18:43  [ТС] 3
Спасибо, а есть ли метод, позволяющий осуществить глубокое копирование без перебора массива?
Я находил что то вроде про NSDeepCopying, но реализовать с ним ничего не получилось, поскольку была какая то ошибка.
0
zulkis
684 / 611 / 43
Регистрация: 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]];
0
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.
0
zulkis
684 / 611 / 43
Регистрация: 13.01.2011
Сообщений: 1,724
10.05.2014, 13:07 6
Цитата Сообщение от residentkms Посмотреть сообщение
Вот именно это я и находил. Но возникала ошибка, связанная с NSCoder.
Ну так методы из протокола нужно реализовать, как написано ...
provided the contents all conform to the NSCoding protocol
1
10.05.2014, 13:07
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.05.2014, 13:07

Что значит глубокое клонирование?
Я понимаю, что такое поверхностное клонирование, но не могу реализовать...

Глубокое клонирование объектов не работает
Всем привет. Я на этапе обучения, дошел вот до темы с объектами, увидел пример...

Более глубокое изучение php, куда двигаться?
На данный момент я не плохо знаком с php, но знаком только с чистым php, т.е....


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru