int main(int argc, char *argv[]) {
@autoreleasepool {
const int x = 1;
const NSMutableArray *array1 = [NSMutableArray array];
const NSMutableString *str1 = @"1";
NSString * const str2 = @"2";
// x = 2; compile error
[array1 addObject:@"2"]; // ok
// [str1 appendString:@"2"]; // runtime error
// Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Attempt to mutate immutable object with appendString:'
// str2 = @"3"; compile error
}
}
我的问题是为什么array1 addObject是合法的,为什么禁止使用str1 appendString?
看到这个打击:NSMutableString *f2(const NSMutableString * const x) {
[x appendString: @" world!"];
return x;
}
int main(int argc, char *argv[]) {
@autoreleasepool {
NSMutableString *x = [@"Hello" mutableCopy];
NSLog(@"%@", f2(x));
}
return 0;
}
为什么这段代码是合法的,如何使用'const'关键字使对象成为不可变的,就像在c ++中一样?
============================================ @see https://softwareengineering.stackexchange.com/questions/151463/do-people-use-const-a-lot-when-programming-in-objective-c
答案 0 :(得分:4)
问题在于,尽管您将str1
声明为NSMutableString
的实例,但它实际上是NSString
的不同子类的实例 - 特别是,它是一个默认情况下__NSCFConstantString
的实例,this class can be changed by setting a compiler flag。这是从@""
返回的那种字符串。
要解决此问题,请使用
const NSMutableString *str1 = [NSMutableString stringWithFormat:@"1"];
答案 1 :(得分:3)
'const'对Objective-C对象没有任何作用。你不能做你想要的。