返回mutable,其中返回值应该是不可变的

时间:2012-06-07 08:36:26

标签: objective-c cocoa

我找到了这段代码

-(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;

2 个答案:

答案 0 :(得分:4)

从技术上讲,返回NSMutableString而不是NSString是没有问题的。由于前者是后者的子类,因此NSMutableString实例支持NSString所做的所有事情。如果你看一下Cocoa,你会注意到,例如,许多alloc / init方法返回你想要创建的类的子类的实例。

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

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

另请注意,如果要返回不可变对象,return [randomString copy];仅在ARC和垃圾回收下正确。使用手动内存管理时,它应为return [[randomString copy] autorelease];return [NSString stringWithString:randomString];

答案 1 :(得分: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;
}