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 我应该在返回NSString的方法中返回NSMutableString吗_Objective C - Fatal编程技术网

Objective c 我应该在返回NSString的方法中返回NSMutableString吗

Objective c 我应该在返回NSString的方法中返回NSMutableString吗,objective-c,Objective C,好的,我有一个方法,它接受一个NSString作为输入,对这个字符串的内容进行操作,然后返回处理过的字符串。因此,宣言是: - (NSString *) processString: (NSString *) str; 问题是:我应该只返回我用作“工作”缓冲区的NSMutableString实例,还是应该在可变字符串周围创建一个新的NSString,然后返回该实例 因此,我应该这样做: - (NSString *) processString: (NSString *) str { N

好的,我有一个方法,它接受一个
NSString
作为输入,对这个字符串的内容进行操作,然后返回处理过的字符串。因此,宣言是:

- (NSString *) processString: (NSString *) str;
问题是:我应该只返回我用作“工作”缓冲区的
NSMutableString
实例,还是应该在可变字符串周围创建一个新的
NSString
,然后返回该实例

因此,我应该这样做:

- (NSString *) processString: (NSString *) str
{
    NSMutableString *work = [NSMutableString stringWithString: str];
    // process 'work'
    return work;
}
或者这个:

- (NSString *) processString: (NSString *) str
{
    NSMutableString *work = [NSMutableString stringWithString: str];
    // process 'work'
    return [NSString stringWithString: work]; // or [work stringValue]?
}

第二个复制了我返回的字符串的另一个副本,除非
NSString
做了一些聪明的事情,比如修改时复制。但是第一个是返回一些调用方可以在理论上稍后去修改的东西。我不在乎他们是否那样做,因为绳子是他们的。但是,有没有合理的理由选择后者而不是前者呢?而且,
stringWithString
stringValue
是否优于其他方法?

完全取决于您需要的防御程度

您的代码的客户机无法合理地测试可变性。因此,客户机无法通过合理的方式从
NSString
转换到
NSMutableString
并突然实现字符串的编译器警告易变性

因此,只要您信任您的客户机,就可以返回可变字符串(作为
NSString
)。即使客户机做了一些愚蠢的事情并对其进行了变异,编译器警告也会被诅咒,没有任何东西会被破坏

重要的是,当您返回某个对象的可变备份存储时,不应该在外部进行变异。在这种情况下,客户端可能会忽略编译器警告和/或强制转换到可变变量,并完全阻塞对象

或者,更微妙的是,客户机可能会抓取一个对假定不可变返回类型的引用,并将其保持足够长的时间,以使其在以后发生变异,从而使其引用处于令人惊讶的状态

最佳实践:当计算并返回瞬时值时,可变性是无关的。当返回对内部可变存储的引用时,最好创建一个不可变副本