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

时间:2013-10-17 14:54:30

标签: objective-c

假设我有这种方法:

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

在主叫方面,我有这个:

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

[self test:data];

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

3 个答案:

答案 0 :(得分:3)

没有。

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

答案 1 :(得分:3)

OP实际上有两个问题:

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

    我同意这个问题的答案是否定的。我也同意'邪恶'实施可以弄明白 可变并改变数据。

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

    我相信,这个问题的答案是。此方法的调用者知道dataNSMutableData。如果test:方法是异步的,或者调用者在调用data之前将test:传递给另一个异步方法,则在data执行时可以更改test。< / p>

答案 2 :(得分:2)

没有。如果方法是将data参数转换为NSMutableData,则可以编辑数据。如果你想确保data是不可变的,你应该这样做:

[self test:[data copy]];