2012-06-22 3 views
0

가 나는 NSArray 속성이 하나 개의 인스턴스합니다 (UIViewController이 모달 인 경우)에이 NSMutableArray 할 필요가 toolbarButtons라는 속성을 가지고 있고, UIViewController이 모달 때, 그것은 단순히 NSArray 할 필요가있다.NSArray에 NSMutableArray를 저장 하시겠습니까?

나는 다음과 같은 속성을 초기화 한 :

@property (nonatomic, copy) NSArray *toolbarButtons; 

내가 초기화하고 toolbarButtons을 다음과 같이

:

- (void) setToolbarButtons 
{ 
     UIBarButtonItem *exitButton = [[UIBarButtonItem alloc] initWithTitle:@"Exit" style:UIBarButtonItemStyleBordered target:self action:@selector(exitButtonPushed)]; 

     toolbarButtonsTemp = (NSMutableArray *)[[NSMutableArray alloc] init]; 
     [(NSMutableArray*)toolbarButtonsTemp addObject:exitButton]; 
     self.toolbarButtons = toolbarButtonsTemp; 

     [exitButton release]; 
} 

그리고 나중에 나는이 같은 서브 클래스에서 위의 메소드를 오버라이드 (override)

- (void) setToolbarButtons 
{ 
    [super setToolbarButtons]; 

    UIBarButtonItem *leftFlexibleSpace = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil]; 
    UIBarButtonItem *toolButton = [[UIBarButtonItem alloc] initWithTitle:@"Tools" style:UIBarButtonItemStyleBordered target:self action:@selector(toolButtonPushed)]; 

    [(NSMutableArray*)self.toolbarButtons addObject:leftFlexibleSpace]; 
    [(NSMutableArray*)self.toolbarButtons addObject:toolButton]; 

    [toolButton release]; 
    [leftFlexibleSpace release]; 
} 

다음 오류가 발생합니다.

[__NSArrayI addObject:]: unrecognized selector sent to instance 

나는이 문제에 많은 해결책이 있음을 알고 있지만, 설계의 관점에서 나는 내가하고있는 일이 가능하고 내 실수를 바로 잡는 지 궁금해하고있다.

+6

궁금한 점이 있다면, 전체 시간 동안 NSMutableArray를 사용하지 않으시겠습니까? – Vervious

+0

@vervious - 툴바가 생성 될 때가 있기 때문에 절대 바뀌지 않을 것입니다. NSMutableArray를 필요로하지 않을 때 나쁜 디자인이 아니겠습니까? –

답변

3
@property (nonatomic, copy) NSArray* array 

의미 :

- (void) setArray: (NSArray*) array 
{ 
    _array = [array copy]; 
} 

[배열 복사] 항상 어레이가있는 NSMutableArray에도 경우, 비 가변 NSArray를 반환한다. 이 경우

- (void) setArray: (NSMutableArray*) array 
{ 
    _array = [array mutableCopy]; 
} 

, 당신은

self.array = (NSMutableArray*) [NSArray new]; 

을 할 수 mutableCopy는 항상 NSMutableArray를 반환으로 배열하는 NSMutableArray를 할당됩니다

@property (nonatomic, copy) NSMutableArray* array 

는 약간 다르게 처리됩니다.

물론 후자는 강력하게 권장하지 않습니다. 그것은 현재 작동합니다. 영원히 작동한다는 보장은 없습니다.

다른 옵션은 NSMutableArray 외에도 강력한 속성을 사용하여 복사본을 직접 처리하는 것입니다.

0

이 경우 캐스팅이 작동하지 않습니다. 당신은있는 NSMutableArray에 속성을 변경해야합니다

@property (nonatomic, copy) NSMutableArray *toolbarButtons; 
0

당신은 당신의 재산에있는 NSMutableArray를 사용해야하지만, 당신은 항상 너무 이런 일을 할 수있는 ...

NSMutableArray *mutArray = [[NSMutableArray alloc] init]; 
    [mutaArray addObject:leftFlexibleSpace]; 
    [mutaArray addObject:toolButton]; 

    self.toolbarButtons = [NSArray arrayWithArray:mutArray]; 
1

당신이 그렇게 할 수 없습니다 !

당신 : 당신은 단지 속성을 캐스팅

[(NSMutableArray*)self.toolbarButtons addObject:leftFlexibleSpace]; 
    [(NSMutableArray*)self.toolbarButtons addObject:toolButton]; 

, 그것은 당신이 그 속성이있는 NSMutableArray이다 런타임에 유망 ...하지만 당신이 거짓말을 의미합니다!

난 당신이 반대 할 제안 : 단지 (가있는 NSArray의 서브 클래스, 그래서 당신은 당신이 원하는 때있는 NSArray로 사용할 수 있습니다) 당신이 그 (것)들에게

을 필요로 할 때, 그냥있는 NSMutableArray 방법을 사용하십시오있는 NSMutableArray로 선언