Создание копии массива - PullRequest
       3

Создание копии массива

1 голос
/ 25 января 2012

Я создаю два изменяемых массива - referenceArray и stemArray, затем заполняю referenceArray URL-адресами.Я хотел бы сделать stemArray точной копией referenceArray.Я понял, что при выполнении присваивания stemArray = referenceArray;не правильно (странные вещи случаются, когда я пытаюсь это сделать).Должен быть лучший способ, чем просто создать второй цикл и таким образом заполнить stemArray?Мне все еще не очень удобно с указателями, и я считаю, что эта ситуация является потенциальным минным полем ... какие-либо намеки или предложения?заранее спасибо:)

    referenceArray = [NSMutableArray arrayWithCapacity:numberOfStems];
    referenceArray = [[NSMutableArray alloc] init];

    stemArray =  [NSMutableArray arrayWithCapacity:numberOfStems];
    stemArray =  [[NSMutableArray alloc] init];

for ( int i = 1; i <= numStems; i++ ) {
    NSString *soundName = [NSString stringWithFormat:@"stem-%i", i];
    NSString *soundPath = [[NSBundle mainBundle] pathForResource:soundName ofType:@"mp3"];
    NSURL *soundFile = [[NSURL alloc] initFileURLWithPath:soundPath];   
    [referenceArray addObject:soundFile];
}

Ответы [ 3 ]

3 голосов
/ 25 января 2012

Вы перезаписываете указатели на свои изменяемые массивы сразу же после их создания - почему эти alloc / init строки там?Если вы хотите получить копию NSArray, просто отправьте ему сообщение copy:

referenceArray = [NSMutableArray arrayWithCapacity:numberOfStems];

for ( int i = 1; i <= numStems; i++ ) {
    // Fill in referenceArray
}

stemArray = [referenceArray copy];
2 голосов
/ 25 января 2012

Почему вы не можете просто выделить & init stemArray после заполнения referenceArray?

Сделайте что-то вроде этого:

stemArray = [[NSMutableArray alloc] initWithArray: referenceArray];

Кроме того,избавьтесь от DOUBLE alloc'а, который вы там делаете (то есть arrayWithCapacity строк).

1 голос
/ 25 января 2012

Здесь есть несколько вопросов.Давайте шаг за шагом пройдемся по существующему коду:

// You are making a new mutable array that has a starting capacity of numberOfStems and assigning it to the referenceArray variable
referenceArray = [NSMutableArray arrayWithCapacity:numberOfStems];

// You then create another new mutable array with the default capacity and re-assign the referenceArray variable.  Fortunately, the first array was created with -arrayWithCapacity: instead of -init...; thus, you aren't leaking an object
referenceArray = [[NSMutableArray alloc] init];

// Same as above
stemArray =  [NSMutableArray arrayWithCapacity:numberOfStems];
stemArray =  [[NSMutableArray alloc] init];

for ( int i = 1; i <= numStems; i++ ) {
    // This part looks fine
    NSString *soundName = [NSString stringWithFormat:@"stem-%i", i];
    NSString *soundPath = [[NSBundle mainBundle] pathForResource:soundName ofType:@"mp3"];
    NSURL *soundFile = [[NSURL alloc] initFileURLWithPath:soundPath];   
    [referenceArray addObject:soundFile];

    // If you are in ARC, you are fine.  If non-ARC, you are leaking soundFile and need to do:
    // [soundFile release];
}

Исходя из вашего исходного описания, вы, вероятно, захотите переместить объявление stemArray в конец и использовать -copy или -mutableCopy:

stemArray = [referenceArray mutableCopy];  // If stemArray is defined as an NSMutableArray

или:

stemArray = [referenceArray copy];  // If stemArray is defined as an NSArray
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...