假设我有这个方法:
- (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]];