我在玩可变性,我想出了以下代码,其中可以将不可变对象强制转换为可变对象。
- (NSString *) getaString {
NSMutableString * string = [[NSMutableString alloc] init];
[string appendString:@"This "];
[string appendString:@"was mutable."];
return string;
}
- (void)viewDidLoad {
[super viewDidLoad];
//Get a string returns an NSString, which is then cast to a mutable string with a compler warning.
NSMutableString * string = [self getaString];
[string appendString:@" And apparently still is"];
_showText.text = string;
}
或者没有编译器警告
- (NSArray *) getaString {
NSMutableString * string = [[NSMutableString alloc] init];
[string appendString:@"This "];
[string appendString:@"was mutable."];
//Cast to NSString.
NSString * immutableString = string;
NSArray * array = [[NSArray alloc] initWithObjects:immutableString, nil];
return array;
}
- (void)viewDidLoad {
[super viewDidLoad];
NSMutableString * string = [[self getaString] objectAtIndex:0];
[string appendString:@" And apparently still is"];
_showText.text = string;
}
UITextField 显示“这是可变的。显然仍然是”的整个字符串,没有编译器警告。我已经看到多个 SO 帖子建议简单地将可变对象转换或使用为不可变对象,但正如我刚刚展示的那样,这可能很危险。此外,演员在没有数组的情况下仍然有效,但我确实收到了编译器警告。
我的问题是,我应该考虑使用 java 风格的防御性副本吗?我没有在目标 C 中看到任何关于防御性副本的提及,而我在 Apple 的文档中只能找到一个模糊的提及,即最好采用一些防御性编程实践。我担心安全性和防止粗心编码。