私は可変性をいじっていましたが、不変オブジェクトを可変オブジェクトにキャストできる次のコードを思いつきました。
- (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 スタイルの防御コピーの使用を検討すべきですか? Objective C で防御的コピーについての言及を見たことがなく、Apple のドキュメントで見つけることができたのは、いくつかの防御的プログラミング手法を採用するのが最善であるという漠然とした言及だけでした。セキュリティと不注意なコーディングからの保護の両方に関心があります。