Ios 目标C为什么将字符串格式化为字符串

Ios 目标C为什么将字符串格式化为字符串,ios,objective-c,string,nsstring,Ios,Objective C,String,Nsstring,在处理以前的开发人员留给我的项目代码时,我遇到了以下构造 -(NSString *)StringCheckWithString:(NSString *)string{ NSString *string2 = [NSString stringWithFormat:@"%@", string]; if([string2 length] == 0){ return @"none"; } else { return string2;

在处理以前的开发人员留给我的项目代码时,我遇到了以下构造

-(NSString *)StringCheckWithString:(NSString *)string{

    NSString *string2 = [NSString stringWithFormat:@"%@", string];

    if([string2 length] == 0){
        return @"none";
    }
    else {
        return string2;
    }
}

有人能解释一下为什么要这样做吗?我觉得这太过复杂了,我不明白为什么要这样做(为了清楚起见,我不明白为什么字符串的格式是这样,我理解长度检查)

传入的参数可以是字符串的任何子类,包括NSMutableString。此代码创建它的不可变副本。这意味着您可以存储返回的字符串,而不必担心其他人修改它

更好的方法是:

NSString *string2 = [string copy];
根据报告:

如果考虑“不可变vs。 “可变”适用于接收对象


字符串可能是未知输入。如果它包含格式字符,而您未经处理就使用它,则可能会发生不好的事情。@thegrinner在
string
包含格式字符的情况下,
string2
现在也包含这些字符?嗯。。。。为什么我的评论被删除了???我指出,
[nsstringwithformat:@“%@”,string]
的效果(如果确实需要的话)可以通过
[string description]
更便宜地实现。虽然你经常看到stringWithFormat在完全没有必要的地方被使用,但它就像坏的DNA一样,从一代复制到下一代。对不起,是的,这就是我的意思。我猜有人看到了为什么在
NSLog
(即
NSLog(string)
vs
NSLog(@“%@”,string)
)中显示原始输入的解释是错误的,并认为这在一般情况下可以解决问题。@thegrinner——我太经常看到这个成语了,在不同的人的不同代码中。这似乎主要是因为错误地认为某些值(如标签文本)必须始终“格式化”,并且,一旦在某些代码中隐藏,它往往会传播到其他方法,然后被其他方法复制。我喜欢这个答案。通过检查用法,我怀疑它的意图,但它作为一种理想的效果是有意义的。我同意@jszumski-如果我要写这样的东西,我会使用
copy
。不
[string copy]
返回与
string
相同类的对象,虽然这里的目的是只返回不可变字符串?@James,no,
-copy
始终返回类的不可变变量(如果它有一个)。只有
-mutableCopy
将返回可变变量。直到。我确实浏览了NSString引用,没有看到任何关于这种行为的提及,但是NSCopying引用非常清楚。我已经添加了一个链接到我的答案。