2013-04-12 2 views
-2

인덱스 별 삽입 및 삭제를 할 수있는 상수 9의 NSMutableArray가 필요합니다. 나는 array = [[NSMutableArray alloc] initWithCapacity:9];이 9의 용량을 가진 배열을 선언 하겠지만, 배열의 크기를 얻으면 0을 반환한다는 것을 알고있다.크기가 9 인 NSMutableArray

해결책을 처음 시도한 것은 용량이 9 인 배열을 선언하는 것이었다. NSNull 객체로 채 웁니다. [: atIndexes : NSMutableArray를 insertObjects] :이 코드는 오류

충돌 배열 인수가 아닌를있는 NSArray '

- (void) setBlankArray: (NSMutableArray*)array { 
    for (int i = 0; i < 9; i++) { 
     [array insertObjects:[NSNull null] atIndexes:i]; 
    } 
} 

-(void) addCurrentTile: (TileView*)aTile { 
    [currentTurnTilesArray insertObject:aTile atIndex: aTile.getValue-1]; 
} 

-(void) removeCurrentTile: (TileView*)aTile { 
    [currentTurnTilesArray removeObjectAtIndex: aTile.getValue-1]; 
} 

를 달성하기 위해 더 나은 방법이 있나요?

답변

3

하지가 1 씩 배열의 크기를 줄일 수 있기 때문에 당신이 함께이 배열을 포장, 당신이해야 할 것은 달성하기 위해 노력 또는 왜하지만 removeCurrentTile이 끊어집니다 무엇 확인 그것은 결코 다른 어떤 수의 요소도 결코 가질 수 없도록 그것을 지키는 클래스입니다.

개인적으로, 당신이하려는 것은 어리석은 행동이라고 생각합니다. 정확히 정확히 9 개의 슬롯이 있다는 것을 알고 있다면 보통 배열로 시작해야합니다. 배열은 변경할 수 없습니다. 어레이 자체가 아닌, 각 인덱스에있는 오브젝트가 변경하려는 오브젝트입니다. 이러한 일들이 문자열로했다 예를 들어, 당신은 9 인 NSMutableString 객체의 불변의 배열을 만들 것입니다 :

NSArray* arr = @[ 
    [NSMutableString string], 
    [NSMutableString string], 
    [NSMutableString string], 
    [NSMutableString string], 
    [NSMutableString string], 
    [NSMutableString string], 
    [NSMutableString string], 
    [NSMutableString string], 
    [NSMutableString string] 
]; 

이제 각각의 문자열이 다른 값으로 변이 될 수 있지만 문자열이 추가되거나 같은 제거 할 수 있습니다 배열의 길이를 변경합니다.

물론 이것은 단지 예일뿐입니다 (문자열 사용). 최대한의 유연성을 위해 NSMutableDictionary 객체 9 개가 포함 된 NSArray가됩니다. 이제 모든 NSMutableDictionary에는 아무것도 포함 할 수 없거나 아무 것도 포함 할 수 없습니다. NSMutableDictionaries의 숫자은 배열 자체가 변경되지 않기 때문에 항상 정확히 9입니다.

+0

화면에 1-9라는 9 개의 단추가 있습니다. 첫 번째 키를 누르면 인덱스 0에있는 객체가 제거됩니다. – joshft91

+0

그러면 * 구현에서 단 하나의 슬롯 아래로 이동하는 모든 객체가 8 개만 존재하게됩니다. 그리고 프로그램이 중단됩니다. – matt

+0

나는 NSMutableArray에 대한 나의 이해가 잘못되었다고 생각하며 정상적인 NSArray와 함께 갈 수있는 방법이 있다고 생각한다. 고마워. 고마워. – joshft91

0

insertObject:atIndex: 또는 더 간단하게는 addObject:을 찾고 있습니다.

+0

어떻게 insertObjects : atIndexes가 들어 왔는지 잘 모릅니다. addObject 문제는 ​​특정 인덱스에서 add 대신 append를 추가한다는 것입니다. 감사. – joshft91

+0

@ joshft91 : 참. 필자는 코드에서 특정 인덱스가 중요하지 않기 때문에 단순화를 제안했습니다. 당신은 단지 * 덧붙이고 있습니다. – Chuck

0

[[NSMutableArray alloc] initWithCapacity:9]은 9 개의 요소가있는 배열을 만들지 않습니다. 비어있는 배열을 생성하여 9 개의 객체를 저장할 수있는 메모리로 초기화합니다. 이 메서드의 목적은 선언 할 때 많은 메모리를 한 번에 할당하는 것이므로이 배열에 요소를 추가 할 수 있으며 시스템은 매번 메모리를 할당하지 않습니다. 이는 최적화에만 해당됩니다.

NSMutableArray reference

+1

크기 매개 변수가 배열 초기화 프로그램에 대한 권장 사항 일 때로는 때때로 그렇게하지도 않습니다. CFArray와의 관계는 전적으로 임의적입니다. – CodaFi

+0

@CodaFi 예, 정확히 정의되어 있습니다. – Mike

0

방금 ​​질문을 읽었으며 필요한 부분을 정확히 이해하고 있다고 생각합니다.

속성 선언 :

@property (nonatomic, retain) NSMutableArray *myArray; 

이를 합성하여이 같은 자사 게터 설정을 무시하고

@synthesize myArray = _myArray; 

:

- (NSMutableArray *)myArray 
{ 
    if (!_myArray) 
    { 
     _myArray = [[NSMutableArray alloc] initWithCapacity:9]; 

     for (int i = 0; i < 9; i++) 
     { 
      [self.myArray addObject:[NSNull null]]; 
     } 
    } 

    return _myArray; 
} 

은 "setBlankArray"방법을 simly됩니다 여기에 코드입니다 속성을 nil로 설정하고 다음 번에 배열 속성의 getter를 호출하면 자동으로 초기화됩니다. w i 번째 정확하게 당신이 필요 :

- (void)setBlankArray:(NSMutableArray *)array 
{ 
    self.myArray = nil; 
} 

매우 중요는 18 개 요소를 포함하는 배열을 만들 것입니다

for (int i = 0; i < 9; i++) 
{ 
    [self.myArray addObject:[NSNull null]]; 
} 

그냥이 언급 된 방법에서이 코드를 작성하지 마십시오.

다음 쓰기 다른 2 가지 방법 :

// you can also change the parameter from "id" to "TileView *" 
- (void)addCurrentTile:(id)sender 
{ 
    NSInteger tileIndex = 1; // replace 1 with ((TileView *) sender).getValue - 1 

    [self.myArray replaceObjectAtIndex:tileIndex 
          withObject:sender]; 
} 

// you can also change the parameter from "id" to "TileView *" 
- (void)removeCurrentTile:(id)sender 
{ 
    NSInteger tileIndex = 1; // replace 1 with ((TileView *) sender).getValue - 1 

    [self.myArray replaceObjectAtIndex:tileIndex 
          withObject:[NSNull null]]; 
} 

그러나, "* TileView"와 "ID"를 대체하고, tileIndex의 값을 설정하는 것을 잊지 마세요에 "((TileView *) 보낸 사람) .getValue - 1 ".

희망 사항은 모두 의미가 있으며 도움이됩니다.

감사합니다.

관련 문제