Objective c 使用[NSString stringWithString:@“some string”与“@”的优缺点;“一些字符串”;
我想比较以下简单的作业:Objective c 使用[NSString stringWithString:@“some string”与“@”的优缺点;“一些字符串”;,objective-c,ios,cocoa-touch,cocoa,nsstring,Objective C,Ios,Cocoa Touch,Cocoa,Nsstring,我想比较以下简单的作业: ... @property(nonatomic,retain) UITextField *textField; ... self.textField.text = @"some string"; self.textField.text = [NSString stringWithString:@"some string"]; self.textField.text = [NSString stringWithFormat:@"some string"]; 其中tex
...
@property(nonatomic,retain) UITextField *textField;
...
self.textField.text = @"some string";
self.textField.text = [NSString stringWithString:@"some string"];
self.textField.text = [NSString stringWithFormat:@"some string"];
其中textField
是UITextField
和text
属性aNSString
。当然,它们都有用。当使用参数时,我知道最后两个的区别。但假设我们只对这种用法感兴趣
问题:
stringWithString:
我认为第一个或第二个用于字符串并不重要。 但是我通常使用第二个 对于第二个和第三个变量,如果您希望在字符串中包含另一个变量,则使用stringWithFormat one。否则,请使用stringWithString
int number = 5;
NSString *str = [NSString stringWithFormat:@"Number is: %i", number];
// Str is "Number is: 5"
使用stringWithString的情况:
NSString *myName = [NSString stringWithString:@"FN LN"];
// myName is "FN LN"
当字符串中没有其他变量时,可以使用后者
此外,这个问题在其他地方也得到了无数次的回答 始终尝试做感觉自然的事情。如果要分配一个常量字符串,则执行该操作,即第一个选项
@“…”
字符串是非常有效的常量,不需要内存管理,因此如果有意义,请使用它们
NSLog(@"%p", @"XX");
NSLog(@"%p", @"XX");
NSLog(@"%p", @"XX");
结果:
0xa2424
0xa2424
0xa2424
0xa2424
0xa2424
0xa2424
0x7f86730
0xf8479b0
0x8a4cdb0
i、 它们在记忆中都是相同的对象
NSLog(@"%p", [NSString stringWithString:@"XX"]);
NSLog(@"%p", @"XX");
NSLog(@"%p", [NSString stringWithString:@"XX"]);
还导致:
0xa2424
0xa2424
0xa2424
0xa2424
0xa2424
0xa2424
0x7f86730
0xf8479b0
0x8a4cdb0
从中可以看出,这两个对象之间没有区别,因此使用-stringWithString:
只是要发送的额外消息。话虽如此,开销通常不会大到足以产生影响,因此无论如何都不应该是什么大问题。就我个人而言,我会选择方法一,因为使用方法二没有任何好处,它只是额外的代码
但是,
NSLog(@"%p", [NSString stringWithFormat:@"XX"]);
NSLog(@"%p", [NSString stringWithFormat:@"XX"]);
NSLog(@"%p", [NSString stringWithFormat:@"XX"]);
结果:
0xa2424
0xa2424
0xa2424
0xa2424
0xa2424
0xa2424
0x7f86730
0xf8479b0
0x8a4cdb0
正如您所看到的,每次都会创建一个新字符串,因为您提供的sting只是一个用于处理以下替换变量的格式字符串,因为您没有避免stringWithFormat:
,除非您需要它
(显然,所有地址都是示例…)
做这种作业,为什么我不应该总是用第一个呢
在你描述的情况下,你应该始终使用第一个。第二种和第三种情况可能会复制常量字符串,但UITextField的text
属性仍被指定为复制提供的字符串。仅仅为了让UITextField的-setText:
可以复制一个常量字符串的副本是没有意义的
比较后两者,编译有什么不同吗-
和/或这两者的运行时间?为什么我要使用stringWithString:at
如果没有呢
我的理解是,-stringWithFormat:
将始终创建一个新字符串,而对于常量字符串,-stringWithString:
可能不会(可能不会)。在这方面,hypercrypt的上述结果非常有说服力;如果您想了解更多,可以使用可变字符串尝试相同的测试
做这种作业,为什么我不应该总是用第一个呢
对于这种任务,你总是使用第一个,而不是最后两个
为什么我要使用stringWithString:如果不是的话
你的直觉是正确的。在大多数情况下,-stringWithString:
的值是可疑的。它主要用于NSMutableString
,它是NSString
的一个子类
例如:
NSMutableString* myString = [NSMutableString stringWithString:@"Foo"];
[myString appendString:@"Bar"];
如果要将NSMutableString转换为NSString,或者确保正在处理NSString实例,也可以使用它。例如:
- (void):setMyString:(NSString*)newString
{
[_myString release];
_myString = [[NSString stringWithString:newString] retain];
}
这是确保\u myString
ivar指向NSString实例而不是NSMutableString实例的一种方法。只有在必要时才会复制newString
实例
然而,大多数开发人员只会使用
\u myString=[newString copy]代码>在这种情况下。对textField
对象的text
属性的声明是什么?添加到问题中…对我来说,看起来像是一个家庭作业问题。这不是声明。请显示@属性…
行。属性属性(例如text
是否复制或保留新值)会产生影响。更重要的是,stringWithFormat:
采用格式字符串,就像NSLog
采用格式字符串一样。您不希望为其第一个参数传递任何不是特定格式字符串的字符串。