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)
vsNSLog(@“%@”,string)
)中显示原始输入的解释是错误的,并认为这在一般情况下可以解决问题。@thegrinner——我太经常看到这个成语了,在不同的人的不同代码中。这似乎主要是因为错误地认为某些值(如标签文本)必须始终“格式化”,并且,一旦在某些代码中隐藏,它往往会传播到其他方法,然后被其他方法复制。我喜欢这个答案。通过检查用法,我怀疑它的意图,但它作为一种理想的效果是有意义的。我同意@jszumski-如果我要写这样的东西,我会使用copy
。不[string copy]
返回与string
相同类的对象,虽然这里的目的是只返回不可变字符串?@James,no,-copy
始终返回类的不可变变量(如果它有一个)。只有-mutableCopy
将返回可变变量。直到。我确实浏览了NSString引用,没有看到任何关于这种行为的提及,但是NSCopying引用非常清楚。我已经添加了一个链接到我的答案。