What is the difference between NSString* mystring and NSString *mystring
我遇到过几个例子,它们在头中声明类的方式不同,比如
1 | NSString* mystring; |
或
1 | NSString *mystring; |
有什么区别?
这是三个完全不同的词汇元素,它们之间的空白量完全无关。就编译器生成的内容而言,这些都是等效的:
1 2 3 4 5 6 | NSString*x; NSString *x; NSString* x; NSString * x; NSString * x; NSString /* comment here */ * /* and another */ x; |
我更喜欢
1 2 | int *x, y; int* x, y; |
创建一个名为
没有区别。这是风格问题。
在objective-c中,你几乎可以把星看作变量"类型"的一部分。
但是,编译器将星解释为"将此变量视为指向声明类型的指针"(在本例中为nsstring)。有趣的是一次定义多个变量:
1 | NSString *myString, *yourString; |
必须在每个变量上使用星号。
是首选项,如果在同一行中声明多个变量,则非常有用,即
1 2 3 | NSString* mystring1, mystring2; // Misleading, mystring2 is not a * NSString *mystring1, mystring2; // Is more clear |
没有区别。这是一个偏好和风格的问题。
第一种方法的优点:
当编码到协议时,有些变量有一个星,而有些没有。例子:
1 2 | NSString* _myString id<SomeProtocol> _collaborator |
与(更混乱的)相比:
1 2 | NString *_myString id<SomeProtocol> _collaborator |
这种方法的缺点:(如所指出的)
1 2 | //Only the first is a pointer. NSString* _myString, _anotherString |
现代的OO语言(如Java)倾向于阻止一行上的多个变量:http://java.xun.com /DOCS/CODECONV/HTML/CODECONVIENDOCT.DOC5.html 2991。
没什么-这是一个个人偏好,关于你是否认为…
这里有一个nsstring指针类型的变量(
或
这里有一个nsstring类型的变量,它是一个指针(
…更清晰。也就是说,只要你始终如一,你就不应该放松睡眠。
在c(和objective-c,作为c的超集)中,
我建议从谷歌的风格指南中查看相关部分。
现实中没有区别。
没什么,在他们之间留出空间甚至都不重要。你甚至可以写
没有区别,只是编码样式偏好。