0

私はこのコードを見つけました

-(NSString *) genRandStringLength: (int) len {

    NSMutableString *randomString = [NSMutableString stringWithCapacity: len];

    for (int i=0; i<len; i++) {
         [randomString appendFormat: @"%C", [letters characterAtIndex: arc4random() % [letters length]]];
    }

    return randomString;
}

結果が不変の可変オブジェクトを渡しても大丈夫ですか?

それで、私たちはするべきですか?

return [randomString copy];

また

return randomString;
4

2 に答える 2

4

NSMutableString技術的には、 の代わりにを返すことは問題ありませんNSString。前者は後者のサブクラスであるため、NSMutableStringインスタンスは実行するすべてをサポートしますNSString。たとえば、Cocoa を見ると、多くの alloc/init メソッドが、作成したいクラスのサブクラスのインスタンスを返すことに気付くでしょう。

あなたの特定のケースでは、文字列がそのメソッドでローカルに作成されており、クラスの他の場所では使用されていないため、メソッドが可変文字列を返しても問題はありません。

一般に、これらのオブジェクトがそれらを返すクラスの ivar/プロパティである場合、可変オブジェクトを返すことはおそらく避けるべきです。このようなことを行うと、メソッドの呼び出し元は、返されたオブジェクトが変更可能であることを発見し、オブジェクトの「所有」インスタンスに変更について通知せずにその内容を変更する可能性があります。

また、不変オブジェクトを返したい場合は、return [randomString copy];ARC とガベージ コレクションの下でのみ正しいことに注意してください。手動のメモリ管理では、return [[randomString copy] autorelease];またはにする必要がありますreturn [NSString stringWithString:randomString];

于 2012-06-07T08:44:34.983 に答える
0

できるよ :-

-(NSString *) genRandStringLength: (int) len
{
  NSMutableString *randomString = [NSMutableString stringWithCapacity: len];

  for (int i=0; i<len; i++) {
     [randomString appendFormat: @"%C", [letters characterAtIndex: arc4random() % [letters length]]];
  }

  NSString *immutableString = [NSString stringWithString:randomString];

  //OR

  NSString *immutableString = (NSString *)randomString;

  return immutableString;
}
于 2012-06-07T08:44:14.463 に答える