附加CString比使用ObjC字符串更好吗?

时间:2011-10-15 19:17:01

标签: objective-c string optimization object nsstring

我正在编写一些执行字符串操作的代码。在这种特殊情况下,将“?partnerId = 30”附加到iTunes Affiliate链接的URL。这是一个原始字符串,完全是静态的。我在想,做得更好:

urlString = [urlString stringByAppendingFormat:@"%@", @"?partnerId=30"];

或者:

urlString = [urlString stringByAppendingFormat:@"%s", "?partnerId=30"];

我认为最好不要实例化整个Objective-C对象,但我从未见过这样做过。

3 个答案:

答案 0 :(得分:4)

使用@“”语法声明的字符串是常量,并且在代码运行时已存在于内存中,因此使用它们不会产生分配损失。

您可能会发现它们的速度非常快,因为它们知道自己的长度,而C字符串需要循环才能找出它们的长度。

通过不使用格式字符串,您可以获得更明显的性能提升(但仍然很小):

urlString = [urlString stringByAppendingString:@"?partnerId=30"];

答案 1 :(得分:3)

文字C字符串和文字NSStrings都表示为常量的内存位。两者都不需要分配使用。

答案 2 :(得分:1)

Objective-C字符串文字是不朽的对象。当二进制文件加载到内存中时,它们会被实例化。有了这些知识,前一个表单创建一个临时的NSString

老实说,知道 更快,因为它还取决于外部条件; NSString可以表示多个编码的字符串(默认值为UTF-16),如果urlString有要执行的编码转换,那么它可能是 的性能损失做法。无论哪种方式,它们都会非常快 - 我不会担心这种情况,除非你有很多(例如数千)这样的东西需要创建并且它是时间关键的,因为它们的性能应该相似。

由于您使用的格式为:NSString = NSString+NSString,因为长度与对象一起存储,并且两个字符串的编码可能已经与目标字符串匹配,因此NSString文字对于非平凡的情况可能更快。您的示例中使用的C字符串也很容易转换为另一种编码,而且它很短。

C字符串作为一种更原始​​的类型,如果您需要定义它们的批次,可以减少加载时间和/或内存使用量。

对于简单的情况,在这种情况下我会坚持使用NSString文字,除非问题比帖子暗示的要大得多。

如果您需要一个C字符串表示以及给定的一组文字,那么您可能更喜欢定义C字符串文字。定义C字符串文字也可能会强制您根据C字符串创建临时NSString。在这种情况下,您可能希望为每个flavor定义一个,或者使用CFString的'create CFString和外部缓冲区'API。同样,这将是非常不寻常的情况(如果您真的没有通过这些字符串的大量集合,则进行微优化)。