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

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

Ответы

Ответ 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 и освободится навсегда.