这可能是一个非常简单的答案,但我不能解决任何问题。我有一个名为board的对象,它被传递给一个方法。我想改变方法内部的电路板状态,但不会影响电路板本身。这是我到目前为止尝试的一个非常简单的代码版本:
- (int) getMove:(Board*)board {
Board* tempBoard = [[Board alloc] initSize:3];
tempBoard.slots = board.slots;
[tempBoard replaceIndex:5 withMark:@"X"];
return 1;
}
如果我使用板对象X调用此方法,则X具有从该方法所做的更改。我是一个指针的菜鸟,所以我认为这就是原因。
答案 0 :(得分:3)
如果想要防止电路板发生变异,你应该让Board
类不可变,即不要暴露任何公共方法来改变它的内部状态。
如果你还需要可变版本,你可以有一个像MutableBoard
这样的子类,它暴露了改变对象的方法。
所以最后你可以做到
- (int)getMove:(Board *)board {
[board makeMove]; // compiler error!
return 1;
}
和
- (void)doSomethingOnTheBoard:(MutableBoard *)board {
[board makeMove]; // ok!
}
我还建议你在-mutableCopy
上实现Board
,以支持创建它的可变实例。
从底线开始,您只需要遵循与NSString
,NSArray
,...一样的API设计,它们是不可变的,具有不可变的子类(NSMutableString
,{{1} } ...)
Apple已经a great guide了解您可以阅读的对象可变性的概念。