Как преобразовать NSMutableArray в NSArray?
Как преобразовать NSMutableArray в NSArray в objective-c?
Ответы
Ответ 1
NSArray *array = [mutableArray copy];
Copy
делает неизменные копии. Это очень полезно, потому что Apple может делать различные оптимизации. Например, отправка Copy
в неизменяемый массив только сохраняет объект и возвращает self
.
Если вы не используете сборку мусора или ARC, помните, что -copy
сохраняет объект.
Ответ 2
An NSMutableArray
является подклассом NSArray
, поэтому вам не всегда нужно преобразовывать, но если вы хотите убедиться, что массив не может быть изменен, вы можете создать NSArray
любой из этих способов в зависимости от о том, хотите ли вы его автореализовать или нет:
/* Not autoreleased */
NSArray *array = [[NSArray alloc] initWithArray:mutableArray];
/* Autoreleased array */
NSArray *array = [NSArray arrayWithArray:mutableArray];
EDIT: Решение, предоставленное Георгом Шёлли, - лучший способ сделать это и намного более чистым, особенно теперь, когда у нас есть ARC и даже не нужно вызывать авторекламу.
Ответ 3
Мне нравятся оба из двух основных решений:
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
Ответ 4
попробуйте этот код ---
NSMutableArray *myMutableArray = [myArray mutableCopy];
и
NSArray *myArray = [myMutableArray copy];
Ответ 5
В objective-c:
NSArray *myArray = [myMutableArray copy];
Быстро:
var arr = myMutableArray as NSArray
Ответ 6
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 появился новый тип данных Массив. Объявите массив с помощью let
, тогда он станет NSArray. И если объявить с помощью ключевого слова var
, то он станет NSMutableArray strong > .
Пример кода:
let newArray = oldArray as Array
Ответ 7
Если вы создаете массив с помощью изменчивости и затем хотите вернуть неизменяемую версию, вы можете просто вернуть измененный массив как "NSArray" через наследование.
- (NSArray *)arrayOfStrings {
NSMutableArray *mutableArray = [NSMutableArray array];
mutableArray[0] = @"foo";
mutableArray[1] = @"bar";
return mutableArray;
}
Если вы "доверяете" вызывающему лицу обрабатывать (технически все еще изменяемый) возвращаемый объект как неизменный NSArray, это более дешевый вариант, чем [mutableArray copy]
.
Apple соглашается:
Чтобы определить, может ли он изменить полученный объект, получатель сообщения должен полагаться на формальный тип возвращаемого значения. Если он получает, например, массив, набранный как неизменный, , он не должен пытаться его мутировать. Это не приемлемая практика программирования, чтобы определить, изменен ли объект на основе его членства в классе.
Вышеприведенная практика более подробно обсуждается здесь:
Лучшая практика: верните mutableArray.copy или mutableArray, если тип возврата - NSArray
Ответ 8
я искал ответ в swift 3, и этот вопрос был показан как первый результат в поиске, и я получил вдохновение от ответа от него
так что вот быстрый код
let array: [String] = nsMutableArrayObject.copy() as! [String]
Ответ 9
NSArray *array = mutableArray;
этот шаблон [mutableArray copy] находится по всему коду.
Перестаньте это делать для изменчивых массивов throwaway, которые
являются временными и освобождаются в конце текущего объема;
нет возможности, чтобы среда выполнения могла оптимизировать это ошибочное замедленное расточительное копирование измененного массива, который вот-вот выйдет из области действия, уменьшится до 0 и освободится навсегда.