Этот вопрос кажется таким же, как мой вопрос Как заполнить пустые пространства содержимым ниже изображения в android
Я нашел решение, используя библиотеку flowtext, найдите первый ответ это может помочь вам до сих пор
NSMutableArray
является подклассом NSArray
, поэтому вам не всегда нужно конвертировать, но если вы хотите убедиться, что массив не может быть изменен, вы можете создать NSArray
любым из этих способов в зависимости от о том, хотите ли вы автоматически выпустить или нет:
/* Not autoreleased */
NSArray *array = [[NSArray alloc] initWithArray:mutableArray];
/* Autoreleased array */
NSArray *array = [NSArray arrayWithArray:mutableArray];
РЕДАКТИРОВАТЬ: Решение , предоставленное Георгом Шолли, является лучшим способом сделать это и намного чище, особенно теперь, когда у нас есть ARC, и нам даже не нужно вызывать autorelease.
Мне нравятся оба из двух основных решений:
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
вы попробуйте этот код ---
NSMutableArray *myMutableArray = [myArray mutableCopy];
и
NSArray *myArray = [myMutableArray copy];
В объективе-c:
NSArray *myArray = [myMutableArray copy];
В быстром:
var arr = myMutableArray as NSArray
Я искал ответ в Swift 3, и этот вопрос был показан в качестве первого результата поиска, и меня вдохновляет ответ, поэтому вот код SWIFT 3
let array: [String] = nsMutableArrayObject.copy() as! [String]
NSArray *array = [mutableArray copy];
Copy
делает неизменные копии. Это очень полезно, потому что Apple может делать различные оптимизации. Например, отправка copy
в неизменяемый массив только сохраняет объект и возвращает self
.
Если вы не используете сборщик мусора или ARC, помните, что -copy
сохраняет объект.
Ниже приведен способ преобразования 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
NSArray *array = mutableArray;
Этот [mutableArray copy]
антипаттерн есть во всем примере кода. Прекратите это делать для одноразовых изменяемых массивов, которые являются временными и освобождаются в конце текущей области.
Нет способа, которым среда выполнения могла бы оптимизировать расточительное копирование изменяемого массива, который вот-вот выйдет из области видимости, уменьшится до 0 и будет освобожден навсегда.
Если вы создаете массив с помощью изменчивости, а затем хотите вернуть неизменяемую версию, вы можете просто вернуть изменяемый массив как «NSArray» через наследование.
- (NSArray *)arrayOfStrings {
NSMutableArray *mutableArray = [NSMutableArray array];
mutableArray[0] = @"foo";
mutableArray[1] = @"bar";
return mutableArray;
}
Если вы «доверяете» вызывающей стороне обрабатывать (технически все еще изменяемый) возвращаемый объект как неизменяемый NSArray, это более дешевый вариант, чем [mutableArray copy]
.
Чтобы определить, может ли он изменить полученный объект, получатель сообщения должен полагаться на формальный тип возвращаемого значения. Если он получает, например, объект массива, типизированный как неизменяемый, он не должен пытаться изменить его . Неприемлемой практикой программирования является определение, является ли объект изменчивым, основываясь на принадлежности к классу.
Описанная выше практика обсуждается более подробно здесь: