Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 返回mutable,其中返回值应该是不可变的_Objective C_Cocoa - Fatal编程技术网

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

Objective c 返回mutable,其中返回值应该是不可变的,objective-c,cocoa,Objective C,Cocoa,我找到了这个密码 -(NSString *) genRandStringLength: (int) len { NSMutableString *randomString = [NSMutableString stringWithCapacity: len]; for (int i=0; i<len; i++) { [randomString appendFormat: @"%C", [letters characterAtIndex: arc4ran

我找到了这个密码

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

你可以做:-

-(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;
}
-(NSString*)genRandStringLength:(int)len
{
NSMutableString*randomString=[NSMutableString stringWithCapacity:len];
对于(int i=0;i您可以执行以下操作:-

-(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;
}
-(NSString*)genRandStringLength:(int)len
{
NSMutableString*randomString=[NSMutableString stringWithCapacity:len];

对于(int i=0;i从技术上讲,返回
NSMutableString
而不是
NSString
是没有问题的。因为前者是后者的子类,
NSMutableString
实例支持
NSString
所做的一切。例如,如果您查看Cocoa,您会注意到许多alloc/init方法都返回要创建的类的子类的实例

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

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


还请注意,如果要返回不可变对象,
return[randomString copy];
仅在ARC和垃圾收集下正确。使用手动内存管理,它应该是
return[[randomString copy]autorelease];
return[NSString stringWithString: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;
}