我一直在寻找解决方案很长一段时间,其他线程都没有帮助。基本上,我想要完成的是创建一个自定义对象数组作为单例,将它们加载到我的级别,然后创建它们的副本,因为将操纵分配给这些对象的变量。但是当级别完成(或失败)时,我希望这些对象保持不变,以便我可以重新加载它们。
以下是我尝试过的一些事情。
- (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-C和Implementing NSCopying了,我仍然感到困惑,所以非常感谢您的进一步帮助。谢谢!
答案 0 :(得分:6)
您收到错误,因为[[NSMutableArray alloc] initWithArray:curLevel.gridTiles copyItems:YES]
在数组中的每个项目上调用copyWithZone:
。您的项目必须符合NSCopying
才能使用此方法,但这是正确的方法。
实施NSCopying:
Tile
课程以添加协议,即@interface Tile : CCNode <NSCopying>
- (id)copyWithZone:(NSZone *)zone
。Tile
的新实例,并将其所有属性分配给当前实例的属性。