如何防止方法改变其参数?

时间:2013-11-17 20:22:33

标签: objective-c

这可能是一个非常简单的答案,但我不能解决任何问题。我有一个名为board的对象,它被传递给一个方法。我想改变方法内部的电路板状态,但不会影响电路板本身。这是我到目前为止尝试的一个非常简单的代码版本:

- (int) getMove:(Board*)board {

  Board* tempBoard = [[Board alloc] initSize:3];

  tempBoard.slots = board.slots;

  [tempBoard replaceIndex:5 withMark:@"X"];

  return 1;
}

如果我使用板对象X调用此方法,则X具有从该方法所做的更改。我是一个指针的菜鸟,所以我认为这就是原因。

1 个答案:

答案 0 :(得分:3)

如果想要防止电路板发生变异,你应该让Board类不可变,即不要暴露任何公共方法来改变它的内部状态。

如果你还需要可变版本,你可以有一个像MutableBoard这样的子类,它暴露了改变对象的方法。

所以最后你可以做到

- (int)getMove:(Board *)board {
    [board makeMove]; // compiler error!
    return 1;
}

- (void)doSomethingOnTheBoard:(MutableBoard *)board {
     [board makeMove]; // ok!
}

我还建议你在-mutableCopy上实现Board,以支持创建它的可变实例。

从底线开始,您只需要遵循与NSStringNSArray,...一样的API设计,它们是不可变的,具有不可变的子类(NSMutableString,{{1} } ...)

Apple已经a great guide了解您可以阅读的对象可变性的概念。