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

Программирование iOS/iPhone

Войти
Регистрация
Восстановить пароль
 
residentkms
21 / 21 / 8
Регистрация: 20.10.2013
Сообщений: 138
Завершенные тесты: 1
#1

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

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

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

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

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

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

Классика - глубокое проникновение - Музыка
Время от времени мы сталкиваемся с музыкой и исполнителями, которые потрясают наше сознание выходом за рамки обычного восприятия,...

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

Глубокое изучение NET CLR - .NET
Всем привет! Поделитесь книгами или ресурсами с актуальной информацией о &quot;кишках&quot; NET CLR ! Если кто читал, есть такая книга Селлз...

Более глубокое изучение php, куда двигаться? - PHP ООП
На данный момент я не плохо знаком с php, но знаком только с чистым php, т.е. отлично усвоил основы. В ближайшее время хочу повысить свой...

Глубокое клонирование объекта, содержащий массив объектов - Java SE
Добрый вечер. Есть перечисление MyEnum и класс с массивом перечислений class A{ MyEnum enum; public GameState clone()...

Копирование - C++
Господа как в с++ можно осуществить копирование файла(system не применять).

копирование - SQL Server
подскажите плз. созданы 2 таблицы, нужно добавить колонку со всеми данными из одной таблицы в другую

Копирование - VBA
Здравствуйте, подскажите мне пожалуйста, как можно копировать строки с помощью VBA по заданному параметру? Например я ввожу название группы...


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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
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
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
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     Глубокое копирование
Ответ Создать тему
Опции темы

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