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

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

9 ответов

NSArray *array = [mutableArray copy];

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

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

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

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

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

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

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

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

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

NSMutableArray *myMutableArray = [myArray mutableCopy];

а также

NSArray *myArray = [myMutableArray copy];

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 3.0 появился новый тип данных Array. Объявите массив с помощью let Ключевое слово тогда станет NSArray А если объявить с помощью var Ключевое слово, то это стало NSMutableArray.

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

let newArray = oldArray as Array

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

NSArray *myArray = [myMutableArray copy];

В скором времени:

 var arr = myMutableArray as NSArray
NSArray *array = mutableArray;

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

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

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

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

    return mutableArray;
}

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

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

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

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

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

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

let array: [String] = nsMutableArrayObject.copy() as! [String]
Другие вопросы по тегам