programing

NSMutableArray를 NSAray로 변환하려면 어떻게 해야 합니까?

abcjava 2023. 5. 31. 14:04
반응형

NSMutableArray를 NSAray로 변환하려면 어떻게 해야 합니까?

에서 NSMutableArray를 NSAray로 변환하려면 어떻게 해야 합니까?

NSArray *array = [mutableArray copy];

Copy 불변의 복사본을 만듭니다.이것은 애플이 다양한 최적화를 할 수 있기 때문에 매우 유용합니다.예를 들어 보내기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가 0일동작하는 방식입니다.

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가 있습니다.키워드를 사용하여 배열을 선언하면 NSArray가 되고 키워드를 사용하여 선언하면 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;
}

호출자가 (기술적으로 여전히 변경 가능한) 반환 개체를 불변의 NSA ray로 취급하도록 "신뢰"하는 경우, 이것은 다음보다 저렴한 옵션입니다.[mutableArray copy].

Apple concurs:

수신된 개체를 변경할 수 있는지 여부를 결정하려면 메시지 수신자가 반환 값의 형식 유형에 의존해야 합니다.예를 들어, 불변으로 입력된 배열 개체를 수신하는 경우에는 이 개체를 변환하려고 시도하지 않아야 합니다.클래스 구성원 자격에 따라 개체가 변경 가능한지 여부를 결정하는 것은 허용되지 않는 프로그래밍 방법입니다.

위의 사례는 여기에서 더 자세히 설명합니다.

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

저는 swift 3에서 답을 찾고 있었고 이 질문은 검색에서 첫 번째 결과로 나타났고 저는 그것으로부터 영감을 얻었기 때문에 여기 swift 3 코드가 있습니다.

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

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

반응형