使用自定义对象创建NSMutableArray的副本

时间:2014-07-15 04:15:53

标签: objective-c cocos2d-iphone

我一直在寻找解决方案很长一段时间,其他线程都没有帮助。基本上,我想要完成的是创建一个自定义对象数组作为单例,将它们加载到我的级别,然后创建它们的副本,因为将操纵分配给这些对象的变量。但是当级别完成(或失败)时,我希望这些对象保持不变,以便我可以重新加载它们。

以下是我尝试过的一些事情。

- (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了,我仍然感到困惑,所以非常感谢您的进一步帮助。谢谢!

1 个答案:

答案 0 :(得分:6)

您收到错误,因为[[NSMutableArray alloc] initWithArray:curLevel.gridTiles copyItems:YES]在数组中的每个项目上调用copyWithZone:。您的项目必须符合NSCopying才能使用此方法,但这是正确的方法。

实施NSCopying:

  1. 更新您的Tile课程以添加协议,即@interface Tile : CCNode <NSCopying>
  2. 在您的Tile实现中实现方法- (id)copyWithZone:(NSZone *)zone
  3. 在该方法中,分配Tile的新实例,并将其所有属性分配给当前实例的属性。