将可变对象传递给不可变参数



假设我有这个方法:

- (void)test:(NSData *)data;

在呼叫端,我有这个:

NSMutableData *data = [[NSMutableData alloc] initWithData:someData];
[self test:data];

测试方法中的数据是否变得不可变? 如果在测试方法中的数据仍在处理时调用端更改了数据,是否会影响测试方法中的数据?

OP实际上有两个问题:

  1. 测试方法中的数据是否变得不可变?

    我同意这个问题的答案是否定的。我也同意"邪恶"的实现可以找出它是可变的并更改数据。

  2. 如果在测试方法中的数据
  3. 仍在处理时调用端更改了数据,是否会影响测试方法中的数据?

    我认为,这个问题的答案是肯定的。 此方法的调用方知道data是一个NSMutableData。 如果test:方法是异步的,或者调用方在调用test:之前将data传递给另一个异步方法,则可以在执行test时更改data

No.

test:可以检查是否[data isKindOfClass:[NSMutableData class]]并将其投射到一个,但这是一个非常糟糕的主意。 test:是在宣传它不会改变传入的对象。

No.如果该方法要强制转换 data 参数以NSMutableData则可以编辑数据。如果要确保data是不可变的,则应执行以下操作:

[self test:[data copy]];

最新更新