Objective-c中的const关键字

时间:2012-10-29 16:54:34

标签: objective-c const

 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

2 个答案:

答案 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对象没有任何作用。你不能做你想要的。