Копирование элементов массива в другой массив с помощью указателей - PullRequest
1 голос
/ 20 февраля 2012

Скажите, у меня есть NSMutableArray *array1 с 10 объектами. Я хочу создать *array2 и добавить 5 объектов от array1 до array2 и хочу, чтобы при изменении этих свойств объекта с array2 они также изменяли 5 конкретных объектов с array1 на Что ж. Как бы я это сделал?

Редактировать: Хорошо, я думаю, что задал неправильный вопрос. Это больше про передачу по ссылке и указателям, которые я слишком сильно путаю:

NSMutableArray *mainArray;
NSMutableArray *secondaryArray;
NSMutableDictionary *dic1;

[mainArray addObject:dic1];
[self changeValues:[mainArray lastObject]];

-(void)changeValues:(NSMutableDictionary*)someDic
{
    [secondaryArray addObject:someDic];
    NSMutableDictionary *aDic=[secondaryArray lastObject];
    ...//some code to change values of aDic
    //by changing aDic, I want to also change the same dic from mainArray

    //so [mainArray lastObject] should be the same exact thing as [secondaryArray lastObject]
}

Как бы я изменил приведенный выше код, чтобы изменения отражались в обоих массивах?

Ответы [ 2 ]

1 голос
/ 20 февраля 2012
NSMutableArray *array2 = [NSMutableArray array];
for (int i=0; i<5; ++i){
    [array2 addObject: [array1 objectAtIndex:i] ]
}

В этом примере у вас есть набор объектов, на которые указывают элементы array1, а также элементы array2, поскольку NSMutableArray содержит указатели на объекты, а не сами объекты.Поэтому, изменяя объект через указатель в одном массиве, вы можете наблюдать, как изменяется указатель через другой массив.


Редактировать

@ mohabitar, вы уже получаетеответы.dic1, someDic и aDic - все эти значения одинаковы.Просто измените aDic (или someDic) и посмотрите результат.

0 голосов
/ 20 февраля 2012

Это звучит как хороший пример для некоторых KVC (Key-Value Coding).

С помощью KVC вы можете создавать индексированные свойства и заставить механизм KVC создавать прокси-массив для индексированного свойства, что позволит вам работать с индексированным свойством, как если бы это был массив.

Ниже приведен краткий проверочный код, протестированный как на OS X, так и на iOS.

Интерфейс:

@property (strong) NSMutableArray *mainArray;

Реализация:

@synthesize mainArray   = _mainArray;


- (id)init
{
    self = [super init];
    if (self) {

        // For simplicity, use strings as the example
        _mainArray = [NSMutableArray arrayWithObjects:
                      @"1st element",
                      @"2nd element",
                      @"3rd element",
                      @"4th element",
                      @"5th element",
                      @"6th element",
                      @"7th element",
                      @"8th element",
                      @"9th element",
                      @"10th element",
                      nil];
    }
    return self;
}


// KVC for a synthetic array, accessible as property @"secondaryArray"

- (NSUInteger) countOfSecondaryArray
{
    return 5;
}


- (id) objectInSecondaryArrayAtIndex: (NSUInteger) index
{
    // In practice you would need your mapping code here. For now
    // we just map through a plain C array:

    static NSUInteger mainToSecondaryMap[5] = {1,4,5,7,8};

    return [self.mainArray objectAtIndex:mainToSecondaryMap[index]];
}


- (void) watchItWork
{
    NSArray *secondaryArray = [self valueForKey:@"secondaryArray"];

    // See how the sub array contains the elements from the main array:

    NSLog(@"%@", secondaryArray);

    // Now change the main array and watch the change reflect in the sub array:

    [self.mainArray replaceObjectAtIndex:4 withObject:@"New String"];

    NSLog(@"%@", secondaryArray);
}

Более подробная информация содержится в документах , в частности, в части по шаблону индексированного средства доступа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...