2014-07-15 1 views
0

저는이 문제에 대한 해결책을 찾기 위해 많은 시간 동안 노력해 왔으며 다른 스레드는 도움이되지 않았습니다. 기본적으로, 내가 달성하고자하는 것은 커스텀 객체의 배열을 싱글 톤으로 생성하고,이를 내 레벨에로드 한 다음,이 객체에 할당 된 변수가 조작되기 때문에 객체의 복사본을 작성하는 것입니다. 레벨이 완료되면 (또는 실패한 경우에도) 객체를 다시로드 할 수 있도록이 객체를 동일하게 유지해야합니다.사용자 지정 개체를 사용하여 NSMutableArray의 복사본 만들기

다음은 내가 시도한 몇 가지 사항입니다.

- (void)spawnStartTiles { 
    //where _puzzleGridTilesArray and curLevel.gridTiles are NSMutableArrays 
    [_puzzleGridTilesArray removeAllObjects]; 
    _puzzleGridTilesArray = [curLevel.gridTiles mutableCopy]; 
    CCLOG(@"tile in curlevel %@", curLevel.gridTiles[0]); //want these to log DIFFERENT objects 
    CCLOG(@"tile in puzzle array %@", _puzzleGridTilesArray[0]);//want these to log DIFFERENT objects 
} 

위와 동일한 개체 ID가 기록됩니다.

- (void)spawnStartTiles { 
    //where _puzzleGridTilesArray and curLevel.gridTiles are NSMutableArrays 
    _puzzleGridTilesArray = [self cloneArray:curLevel.gridTiles]; 
    CCLOG(@"tile in curlevel %@", curLevel.gridTiles[0]); //want these to log DIFFERENT objects 
    CCLOG(@"tile in puzzle array %@", _puzzleGridTilesArray[0]);//want these to log DIFFERENT objects 
} 

-(NSMutableArray*)cloneArray:(NSMutableArray *)myArray { 
    return [[NSMutableArray alloc] initWithArray: myArray]; 
} 

여전히 동일한 개체 ID를 기록합니다.

- (void)spawnStartTiles { 
    //where _puzzleGridTilesArray and curLevel.gridTiles are NSMutableArrays 
    _puzzleGridTilesArray = [[NSMutableArray alloc] initWithArray:curLevel.gridTiles copyItems:YES]; 
    CCLOG(@"tile in curlevel %@", curLevel.gridTiles[0]); //want these to log DIFFERENT objects 
    CCLOG(@"tile in puzzle array %@", _puzzleGridTilesArray[0]);//want these to log DIFFERENT objects 
} 

위의 경우 런타임 오류가 발생합니다. 나는 복사하고있는 객체가 Tile이라는 커스텀 클래스이기 때문에 이것이라고 생각한다. 클래스는 CCNode이고 .h 파일은 아래에 있습니다.

#import "CCNode.h" 

@interface Tile : CCNode 

@property (nonatomic, assign) NSInteger value; 
@property (nonatomic, assign) NSInteger gemLevel; 
@property (nonatomic, assign) BOOL mergedThisRound; 
- (void)updateValueDisplay:(BOOL)bannerTiles difficultyMode:(int)difficultyMode; 
- (void)updateOpacity:(NSInteger)opacityVariable; 
- (void)tileHasBeenSelected:(BOOL)tileHasBeenTouched; 

@end 

어떻게 든이 클래스를 변형하여 복사 할 수 있습니까? http://www.techotopia.com/index.php/Copying_Objects_in_Objective-CImplementing NSCopying을 보았습니다. 여전히 혼란 스럽습니다. 그래서 더 많은 도움을 주시면 감사하겠습니다. 고맙습니다!

답변

6

[[NSMutableArray alloc] initWithArray:curLevel.gridTiles copyItems:YES]은 배열의 각 항목에 copyWithZone:을 호출하기 때문에 오류가 발생합니다. 이 방법을 사용하려면 항목이 NSCopying이어야하지만 올바른 방법입니다.

는 NSCopying을 구현하는 방법은 다음과 같습니다 프로토콜을 추가 할 수

  1. 업데이트합니다 Tile 클래스, 즉 @interface Tile : CCNode <NSCopying>
  2. 당신의 타일 구현 방법 - (id)copyWithZone:(NSZone *)zone를 구현합니다.
  3. 이 방법에서는 Tile의 새 인스턴스를 할당하고이 인스턴스의 모든 속성을 현재 인스턴스의 속성에 할당합니다.
+0

감사! 이것은 나를 위해 일했다 =) 이제 나는 그것도 훨씬 더 잘 이해한다. – spaderdabomb