我在玩可变性,我想出了以下代码,其中可以将不可变对象强制转换为可变对象。
- (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 的文档中只能找到一个模糊的提及,即最好采用一些防御性编程实践。我担心安全性和防止粗心编码。