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

从技术上讲,返回 anNSMutableString而不是NSString. 由于前者是后者的子类,因此NSMutableString实例支持 anNSString所做的一切。例如,如果您查看 Cocoa,您会注意到许多 alloc/init 方法返回您要创建的类的子类的实例。

在您的特定情况下,如果该方法返回一个可变字符串,我认为没有问题,因为该字符串是在该方法中本地创建的,并且没有在类中的其他地方使用。

通常,如果这些对象是返回它们的类的 ivars/属性,您可能应该避免返回可变对象。如果您这样做,该方法的调用者可能会发现返回的对象是可变的,然后更改其内容而不通知对象的“拥有”实例有关更改。

还要注意,如果要返回一个不可变对象,return [randomString copy];只有在 ARC 和垃圾回收下才是正确的。使用手动内存管理,它应该是return [[randomString copy] autorelease];or 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 回答