NSString连接支持多长时间了?

时间:2015-09-07 11:11:30

标签: ios objective-c string cocoa-touch concatenation

我刚刚在编辑的一些遗留代码中看到了这一行:

[UIImage imageNamed:@"data/visuals/interface/" @"backgroundViewController"];
                                             ^^^^
                                   "Oops, what have I done here?"

我认为我必须偶然地将某些东西粘贴在错误的位置,但撤消并未改变该行。出于好奇,我建立了程序,它成功了!

Whaddyaknow? Obj-c有一种更简洁的串联字符串文字的方式。

我添加了一些测试:

简单日志

NSLog(@"data/visuals/interface/" @"backgroundViewController");
  

数据/视觉/接口/ backgroundViewController

参数

NSURL *url = [NSURL URLWithString:@"http://" @"test.com" @"/path"];
NSLog(@"URL:%@", url);
  

的URL:http://test.com/path

使用变量

NSString *s = @"string1";
NSString *s2 = @"string2";

NSLog(@"%@", s s2);
  

不编译(对此不感到惊讶)

其他文字

NSNumber *number = @1 @2;
  

不编译

一些问题

  • 这个字符串连接是否记录在任何地方?
  • 支持多久了?
  • 底层实施是什么?我希望它会[s1 stringByAppendingString:s2]
  • 任何权威机构都认为这是一种好习惯吗?

1 个答案:

答案 0 :(得分:4)

这种连接静态NSStrings的方法是一种编译时编译器功能,已有十多年的历史。它通常用于允许长的常量字符串分成几行。几十年来,“C”中也提供了类似的功能。

C编程语言一书中,1988年第二版,第38页描述了字符串连接,因此它已经存在了很长时间。

摘自本书:

  

字符串常量可以在编译时连接:

"hello," " world" is equivalent to "hello, world"
  

这对于跨多个源代码行吐出长字符串非常有用。

Objective-C是“C”的严格超集,因此它始终支持“C”字符串连接,我的猜测是因为静态NSString连接一直可用。

当用于将静态字符串分成若干行以便于阅读时,这被认为是一种很好的做法。