2
 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;
}

なぜこのコードが合法なのか、C++ のように「const」キーワードを使用してオブジェクトを不変にするにはどうすればよいですか?

============================================ @see https:// softwareengineering.stackexchange.com/questions/151463/do-people-use-const-a-lot-when-programming-in-objective-c

4

2 に答える 2

4

str1問題は、 のインスタンスであると宣言したにもかかわらずNSMutableString、実際には の別のサブクラスのインスタンスであるNSStringことです。特に、 __NSCFConstantStringデフォルトでは のインスタンスですが、このクラスはコンパイラ フラグを設定することで変更できます。これは、 から返される文字列の種類です@""

これを修正するには、使用するだけです

const NSMutableString *str1 = [NSMutableString stringWithFormat:@"1"];
于 2012-10-29T17:07:14.073 に答える
3

「const」は、Objective-C オブジェクトに対して何もしません。あなたが求めていることをすることはできません。

于 2012-10-29T17:14:12.947 に答える