NSMutableArray와 같은 변이 가능한 객체와 함께 OBJ-C 2.0 속성을 사용하는 가장 좋은 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/816720

문제

NSMutableArray 속성이있는 OBJ-C 2.0 클래스가 있습니다. 다음 코드를 사용하면 합성 된 세트가 부정확 한 사본이 아니라 불변의 사본을 제공합니다.

@property (readwrite, copy) NSMutableArray *myArray;

애플이 다음 구문을 구현하지 않은 이유가 있습니까?

@property (readwrite, mutablecopy) NSMutableArray *myArray;

우리는 가지고 있지 않기 때문에 mutablecopy,이 (일반적인) 상황을 처리하는 가장 좋은 방법은 무엇입니까? -mutablecopy를하는 내 자신의 세터를 작성해야합니까?

도움이 되었습니까?

해결책

앞에서 말했듯이 올바른 방법 그렇게하는 것은 부동산 배열을 속성으로 만드는 것이 아닙니다. KVC를 준수하기 위해 구현해야 할 것에 대한 훌륭한 설명이 있습니다. 여기.

다른 팁

나는 얼마 전에 같은 문제를 겪고 Apple 개발자 연결에 대한 문서 세터의 구현을 제공하는 것이 좋습니다. 코드 샘플 형태 링크 된 문서 :

@interface MyClass : NSObject {
    NSMutableArray *myArray;
}
@property (nonatomic, copy) NSMutableArray *myArray;
@end

@implementation MyClass

@synthesize myArray;

- (void)setMyArray:(NSMutableArray *)newArray {
    if (myArray != newArray) {
        [myArray release];
        myArray = [newArray mutableCopy];
    }
}

지나가는 것은 흔하지 않습니다 NSMutableArray코코아에서. 표준 코코아 실습은 키 값 코딩 준수를 구현하는 것입니다. 행동 양식 인덱스 된 to-many 속성의 경우. 이것은 두 가지 이점이 있습니다.

  1. 키 가치 관찰은 예상대로 작동합니다 (NSMutableARray를 관찰하면 유용하지 않은 행동으로 이어지는 몇 가지 사례가 있습니다)
  2. 데이터 구조의 구현은 돌연변이 방법을 노출시키기 때문에 숨겨져 있습니다 (예 : -[MyObject insertObjectInMyProperty:(id)newObject atIndex:(NSUInteger)i] 데이터 구조 자체가 아닙니다.

변한 어레이를 지나가는 것은 실제로 코코아에서 일반적인 관행이 아닙니다. 비공개 Mutable Array를 내부 스토리지로 사용할 수 있지만 일반 NSARRAY 객체를 사용하여 객체를 추가하거나 가져 오는 메소드를 생성 할 수 있습니다. 이것이 MutableCopy 속성 선언이없는 이유 일 수 있습니다.

자신의 세터를 작성해야합니다.

NSMutableArray를 유지하는 올바른 방법은 재산을 유지하는 것입니다.

@property (nonatomic, retain) NSMutableArray *myArray;

자신의 세터를 작성하거나 사본을 사용할 필요가 없습니다. 사본 속성은 속성을 다른 개체에 캡처 할 때 실제로 복사 해야하는 NSARRAY와 함께 사용해야합니다. 예를 들어, NSMutableARRAY 객체를 사본 속성과 함께 NSARRAY 유형의 속성에 할당하면, 그 시점부터 불변의 속성으로 "캡처"하기 위해 Mutable Array의 사본을 만들고 싶습니다.

그리고 MARC는 올바른 접근 방식을 가지고 있습니다. 일반적으로 NSMutableArray를 대상의 공개 API의 일부로 만들지는 않습니다. 공공 재산이있는 경우 사본 속성이있는 NSARRAY 일 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top