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

spa*_*omb 0 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
}
Run Code Online (Sandbox Code Playgroud)

以上记录了相同的对象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];
}
Run Code Online (Sandbox Code Playgroud)

仍记录相同的对象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
}
Run Code Online (Sandbox Code Playgroud)

以上给出了运行时错误.我认为这是因为我复制的对象是一个名为的自定义类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
Run Code Online (Sandbox Code Playgroud)

有没有办法以某种方式转换这个类,以便可以复制?我查看了http://www.techotopia.com/index.php/Copying_Objects_in_Objective-C实施NSCopying,我仍然感到困惑,所以非常感谢您的进一步帮助.谢谢!

dal*_*ook 6

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

实施NSCopying:

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