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

Этот вопрос кажется таким же, как мой вопрос Как заполнить пустые пространства содержимым ниже изображения в android

Я нашел решение, используя библиотеку flowtext, найдите первый ответ это может помочь вам до сих пор

373
задан Samuel Spencer 4 May 2013 в 16:55
поделиться

9 ответов

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

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

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

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

359
ответ дан Community 4 May 2013 в 16:55
поделиться

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

NSArray *array = [NSArray arrayWithArray:mutableArray];

Или

NSArray *array = [mutableArray copy];

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

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

NSMutableArray *mutableArray = nil;
NSArray *array = [mutableArray copy];
// array == nil
112
ответ дан Richard Venable 4 May 2013 в 16:55
поделиться

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

NSMutableArray *myMutableArray = [myArray mutableCopy];

и

NSArray *myArray = [myMutableArray copy];
18
ответ дан Jerry Thomsan 4 May 2013 в 16:55
поделиться

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

NSArray *myArray = [myMutableArray copy];

В быстром:

 var arr = myMutableArray as NSArray
3
ответ дан Vikram Biwal 4 May 2013 в 16:55
поделиться

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

let array: [String] = nsMutableArrayObject.copy() as! [String]
0
ответ дан Amr Angry 4 May 2013 в 16:55
поделиться
NSArray *array = [mutableArray copy];

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

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

496
ответ дан Georg Schölly 4 May 2013 в 16:55
поделиться

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 4 May 2013 в 16:55
поделиться
NSArray *array = mutableArray;

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

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

2
ответ дан Anton Tropashko 4 May 2013 в 16:55
поделиться

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

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

    return mutableArray;
}

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

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

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

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

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

1
ответ дан Community 4 May 2013 в 16:55
поделиться