development

NSMutableArray를 NSArray로 어떻게 변환합니까?

big-blog 2020. 2. 26. 07:56
반응형

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으로 선언되고 할당 해제 된 변경 가능한 배열의 낭비적인 복사를 최적화 할 수있는 방법은 없습니다.


가변성을 통해 배열을 생성 한 다음 불변 버전을 반환하려는 경우 상속을 통해 가변 배열을 "NSArray"로 간단히 반환 할 수 있습니다.

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

    return mutableArray;
}

(기술적으로 여전히 변경 가능한) 반환 객체를 불변의 NSArray로 취급하기 위해 호출자를 "신뢰"하는 경우이 방법이보다 저렴 [mutableArray copy]합니다.

애플은 동의한다.

수신 된 오브젝트를 변경할 수 있는지 여부를 판별하려면 메시지 수신자는 공식적인 리턴 값 유형에 의존해야합니다. 예를 들어 불변으로 입력 된 배열 객체를 받으면이를 변경 하지 않아야합니다 . 클래스 멤버쉽을 기반으로 객체가 변경 가능한지 여부를 결정하는 것은 허용되는 프로그래밍 방식이 아닙니다.

위의 연습은 여기에서 더 자세히 설명됩니다.

모범 사례 : 반환 유형이 NSArray 인 경우 mutableArray.copy 또는 mutableArray를 반환합니다.


나는 신속한 3의 답을 찾고 있었고이 질문은 검색의 첫 번째 결과로 나타 났으며 나는 그것에 대한 답을 얻었으므로 여기에는 신속한 3 코드가 있습니다.

let array: [String] = nsMutableArrayObject.copy() as! [String]

참고 URL : https://stackoverflow.com/questions/1768937/how-do-i-convert-nsmutablearray-to-nsarray



반응형