假设我有这个方法:
- (void)test:(NSData *)data;
在调用方,我有这个:
NSMutableData *data = [[NSMutableData alloc] initWithData:someData];
[self test:data];
测试方法中的数据是否变得不可变?如果在调用端更改了数据,而测试方法内部的数据仍在处理中,是否会影响测试方法内部的数据?
假设我有这个方法:
- (void)test:(NSData *)data;
在调用方,我有这个:
NSMutableData *data = [[NSMutableData alloc] initWithData:someData];
[self test:data];
测试方法中的数据是否变得不可变?如果在调用端更改了数据,而测试方法内部的数据仍在处理中,是否会影响测试方法内部的数据?
不。
test:
可以检查是否[data isKindOfClass:[NSMutableData class]]
并将其转换为一个,但这是一个非常糟糕的主意。 test:
正在宣传它不会改变传入的对象。
OP实际上有两个问题:
测试方法中的数据是否变得不可变?
我同意这个问题的答案是否定的。我也同意一个“邪恶”的实现可以找出它是可变的并改变数据。
如果在调用端更改了数据,而测试方法内部的数据仍在处理中,是否会影响测试方法内部的数据?
我相信,这个问题的答案是Yes。此方法的调用者知道这data
是一个NSMutableData
. 如果test:
方法是异步的,或者调用者data
在调用之前传递给另一个异步方法,test:
则data
可以在test
执行时更改。
不。如果方法是将data
参数转换为NSMutableData
它可以编辑数据。如果你想确保它data
是不可变的,你应该这样做:
[self test:[data copy]];