[objective-c] NSMutableArray를 NSArray로 어떻게 변환합니까?

NSMutableArray를 NSArray로 변환하는 방법 ?



답변

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];

편집 : Georg Schölly가 제공하는 솔루션 은 더 나은 방법이며 훨씬 깨끗합니다. 특히 ARC가 있고 자동 릴리스를 호출 할 필요가 없기 때문에 더욱 그렇습니다.


답변

나는 두 가지 주요 솔루션을 모두 좋아합니다.

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];


답변

목표 -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


답변

objective-c에서 :

NSArray *myArray = [myMutableArray copy];

신속하게 :

 var arr = myMutableArray as NSArray


답변

NSArray *array = mutableArray;

[mutableArray copy]반 패턴은 모든 샘플 코드에 적용됩니다. 과도하고 현재 범위의 끝에서 할당이 취소되는 가변 가변 배열의 경우 중지하십시오.

런타임에서 범위를 벗어나려고하고 0으로 선언되고 할당 해제 된 변경 가능한 배열의 낭비적인 복사를 최적화 할 수있는 방법은 없습니다.