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



我找到了这段代码

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

从技术上讲,返回NSMutableString而不是NSString是没有问题的。由于前者是后者的子类,因此NSMutableString实例支持NSString执行的所有操作。例如,如果您查看 Cocoa,您会注意到许多 alloc/init 方法返回要创建的类的子类的实例。

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

通常,如果

可变对象是返回它们的类的 ivar/属性,则可能应该避免返回可变对象。如果执行此类操作,该方法的调用方可以发现返回的对象是可变的,然后更改其内容,而无需通知对象的"拥有"实例有关更改的信息。

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

你可以

做:-

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

最新更新