it-swarm.com.ru

Как мне преобразовать NSMutableArray в NSArray?

Как мне преобразовать NSMutableArray в NSArray в target-c ?

373
marcy
NSArray *array = [mutableArray copy];

Copy делает неизменяемые копии. Это очень полезно, потому что Apple может выполнять различные оптимизации. Например, отправка copy в неизменяемый массив только сохраняет объект и возвращает self.

Если вы не используете сборщик мусора или ARC, помните, что -copy сохраняет объект.

496
Georg Schölly

NSMutableArray является подклассом NSArray, поэтому вам не всегда нужно конвертировать, но если вы хотите убедиться, что массив не может быть изменен, вы можете создать NSArray одним из следующих способов в зависимости от того, хотите ли вы его автоматически освободить или нет:

/* Not autoreleased */
NSArray *array = [[NSArray alloc] initWithArray:mutableArray];

/* Autoreleased array */
NSArray *array = [NSArray arrayWithArray:mutableArray];

РЕДАКТИРОВАТЬ: Решение , предоставленное Георгом Шолли, является лучшим способом сделать это и намного чище, особенно теперь, когда у нас есть ARC и даже не нужно вызывать авто-релиз.

359
hallski

Мне нравятся оба основных решения:

NSArray *array = [NSArray arrayWithArray:mutableArray];

Или же

NSArray *array = [mutableArray copy];

основное отличие я вижу в них как они себя ведут, когда mutableArray равен nil:

NSMutableArray *mutableArray = nil;
NSArray *array = [NSArray arrayWithArray:mutableArray];
// array == @[] (empty array)

NSMutableArray *mutableArray = nil;
NSArray *array = [mutableArray copy];
// array == nil
112
Richard Venable

вы попробуйте этот код ---

NSMutableArray *myMutableArray = [myArray mutableCopy];

а также

NSArray *myArray = [myMutableArray copy];
18
Jerry Thomsan

Objective-C

Ниже приведен способ преобразования NSMutableArray в NSArray:

//oldArray is having NSMutableArray data-type.
//Using Init with Array method.
NSArray *newArray1 = [[NSArray alloc]initWithArray:oldArray];

//Make copy of array
NSArray *newArray2 = [oldArray copy];

//Make mutablecopy of array
NSArray *newArray3 = [oldArray mutableCopy];

//Directly stored NSMutableArray to NSArray.
NSArray *newArray4 = oldArray;

Swift

В Swift 3.0 появился новый тип данных Array. Объявите массив с помощью ключевого слова let, тогда он станет NSArray А если объявить с помощью ключевого слова var, то он станет NSMutableArray.

Образец кода:

let newArray = oldArray as Array
4
Sakir Sherasiya

В объективе-c:

NSArray *myArray = [myMutableArray copy];

В Swift:

 var arr = myMutableArray as NSArray
3
Vikram Biwal
NSArray *array = mutableArray;

Этот антипаттерн [mutableArray copy] находится во всем примере кода. Прекратите делать это для одноразовых изменяемых массивов, которые являются временными и освобождаются в конце текущей области.

Нет никакого способа, которым среда выполнения могла бы оптимизировать расточительное копирование изменяемого массива, который вот-вот выйдет из области видимости, уменьшится до 0 и будет освобожден навсегда.

2
Anton Tropashko

Если вы создаете массив с помощью изменчивости, а затем хотите вернуть неизменяемую версию, вы можете просто вернуть изменяемый массив как "NSArray" через наследование.

- (NSArray *)arrayOfStrings {
    NSMutableArray *mutableArray = [NSMutableArray array];
    mutableArray[0] = @"foo";
    mutableArray[1] = @"bar";

    return mutableArray;
}

Если вы "доверяете" вызывающей стороне для обработки (технически все еще изменяемого) возвращаемого объекта как неизменяемого NSArray, это более дешевый вариант, чем [mutableArray copy].

Apple соглашается:

Чтобы определить, может ли он изменить полученный объект, получатель сообщения должен полагаться на формальный тип возвращаемого значения. Если он получает, например, объект массива, типизированный как неизменяемый, он не должен пытаться изменить его . Неприемлемой практикой программирования является определение того, является ли объект изменчивым, основываясь на его принадлежности к классу.

Вышеуказанная практика обсуждается более подробно здесь:

Рекомендация: возвращайте mutableArray.copy или mutableArray, если тип возвращаемого значения - NSArray

1
pkamb

я искал ответ в Swift 3, и этот вопрос был показан как первый результат поиска, и я получил ответ от него, поэтому вот код Swift 3

let array: [String] = nsMutableArrayObject.copy() as! [String]
0
Amr Angry