2013-02-13 1 views
1

저는 애플에서 Your Second iOS App을 공부하고 있습니다. 이 프로젝트는 ARC를 기반으로합니다.mutableCopy가 왜 여기 있습니까?

// header 
@interface BirdSightingDataController : NSObject 

@property (nonatomic, copy) NSMutableArray *masterBirdSightingList; 

@end 

// implementation 
- (void)setMasterBirdSightingList:(NSMutableArray *)newList { 
    if (_masterBirdSightingList != newList) { 
     _masterBirdSightingList = [newList mutableCopy]; 
    } 
} 

- (void)initializeDefaultDataList { 
    NSMutableArray *sightingList = [[NSMutableArray alloc] init]; 
    self.masterBirdSightingList = sightingList; 

    … 
} 

이 코드는 masterBirdSightingList의 기본 setter 메소드를 오버라이드 이유를 모르겠어요 :

그리고 예를 공부하는 동안, 나는 예에서 다음 코드에 관한 질문을했다

.

masterBirdSightingList 속성의 유형은 NSMutableArray이고 NSMutableArray 유형의 _masterBirdSightingList 인스턴스 변수에도 복사됩니다. 나는 이것이 완벽하다고 생각한다.

여기에 _masterBirdSightingList = [newList mutableCopy];이있는 이유는 무엇입니까? 어떤 경우에 setMasterBirdSightingList:NSArray 유형의 인수와 함께 호출됩니까?

+0

그렇습니다. 정적 배열이 전달되는 경우를 고려해야합니다. masterBirdSightingList가 가변 배열로 선언되었으므로이 코드는 다른 곳에서 코드가 NSArray를 변경하려고 시도 할 때 문제를 방지합니다. – Bergasms

+0

무엇인가요? 흥미로운 점은 호출자가 변경 가능한 배열을 setter에 전달하는 경우에도 이것이 필요하다는 것입니다. –

+0

'copy' 플래그는 여기서 중요한가? 나는 여기에 합성 자에게 속성 접근자를 합성하는 방법을 알려주는 인상을 받고 있었고 여기서는 합성되지 않았기 때문에 ... – cHao

답변

2

기본 구현이 copy을 호출하기 때문에 필요합니다. 변경 가능한 배열 대신 변경 불가능한 배열로 끝나기 때문입니다.

+3

'NSMutableArray'에'copy' 메소드를 호출하면 실제로 그 복사본을 다른 NSMutableArray가 아닌 불변의 NSArray로 반환합니다. – rmaddy

관련 문제