我刚开始学习Objective-C,来自VB .Net和C#.Net背景。我理解指针用法,但在Objective-C示例中,我看到星号放在几个不同的地方,并尽可能搜索,我无法找到答案,为什么会这样。我尝试的每一次搜索都会出现关于指针的各种解释(我真的不需要),但没有提到星号不同位置的原因/影响。以下是我见过的一些例子:
NSString *string;
NSString * string;
(NSString *) string;
NSString* string;
星号的这些不同位置是什么意思?我确信这是一个简单的答案,但到目前为止,无法在任何Apple教程和参考文档或在线中找到它是令人沮丧的。
有人可以结束我的痛苦并回答这个令人困惑的问题吗?谢谢!
答案 0 :(得分:32)
没有区别,但是您应该知道只有第一个“标记”(可以这么说)定义了类型名称,而*不是类型名称的一部分。也就是说:
NSString *aString, bString;
创建一个指向 - NSString
的指针和一个NSString
。要使两者成为指针,请执行以下任一操作:
NSString *aString, *bString;
或:
NSString *aString;
NSString *bString;
答案 1 :(得分:23)
1. NSString *string;
2. NSString * string;
3. (NSString *) string;
4. NSString* string;
1,2和4完全相同。这都是风格。选择你想要的任何东西,或混合起来。
选择#3也有另一种含义,它用于铸造。例如:
t = (NSString *)string ;
会将string
强制转换为NSString
指针。
但是选择#3是您可能在.h文件或.m文件中的函数定义中使用的语法。在实际函数中,在“运行”的代码中它具有不同的含义。
答案 2 :(得分:19)
没有区别 - 这是一种风格问题。它们都声明了一个名为string
的变量,它是一个指向NSString的指针。在某些情况下(特别是方法声明),括号是必要的,以便澄清它是一种类型声明。
答案 3 :(得分:6)
你把星号放在哪里都没关系,所有语句都会创建NSString类型的指针。
在一行中使用多个变量名时,您必须为每个变量编写星号。
NSString * nsstring, * nsstring2;
答案 4 :(得分:6)
1. NSString *string;
2. NSString * string;
3. (NSString *) string;
4. NSString* string;
1,2和4是等价的。 C语言(和C的Objective-C超集)指定对空白区域不敏感的语法。因此,您可以根据自己的喜好自由添加空间。所有相关语法都由非空白字符分隔(例如{
,}
,;
等等。[1]。
3是一个类型转换(告诉C编译器使用NSString*
类型而不管string
的声明类型。在Objective-C中,很少需要类型转换对象实例。可以将id
类型用于可以引用任何对象类型的实例的变量。
在方法声明中,语法3(有时没有结束分号)用于声明方法参数的类型。 Objective-C方法可能如下所示:
- (void)myMethodThatTakesAString:(NSString*)string;
在此声明中,名为string
的参数的类型为类型NSString*
(前导-
表示与类方法相反的实例方法)。具有多个参数的方法声明可能如下所示:
- (void)myMethodTakingAString:(NSString*)string andAnInteger:(NSInteger)intParam;
[1]将其与使用空格作为块分隔符的Python等语言进行比较。
答案 5 :(得分:5)
没有区别,*
放置在指针声明中是无关紧要的。
答案 6 :(得分:4)
没有区别,空白位置无关紧要。
答案 7 :(得分:4)
绝对没有区别。 NSString * mystring和NSString * myString是相同的。
答案 8 :(得分:3)
实际上所有的等价物:指向nsstring的指针!!
答案 9 :(得分:3)
这些之间完全没有区别。
答案 10 :(得分:3)
*的工作方式与标准C中的工作方式相同。
这是一个很好的入门,将*放在不同的地方以及它的作用: http://boredzo.org/pointers/
答案 11 :(得分:2)
1,2和4是等效的,并定义指向NSString的指针。我个人的偏好是尽可能地模仿K& R,所以我喜欢使用NSString *string;
(NString*)string;
虽然是有效的陈述,但它本身并没有真正做任何事情。
$ cat foo.m
#include <Cocoa/Cocoa.h>
void foo()
{
NSString *string;
(NSString*) string; // doesn't do anything
42; // doesn't do anything either
}
$ gcc -Wall -c foo.m
foo.m: In function 'foo':
foo.m:7: warning: statement with no effect
foo.m:8: warning: statement with no effect
答案 12 :(得分:0)
在xcode4文档示例代码中,您可以一直看到3.例如在MoveMeView.m中
#if 1
- (void)growAnimationDidStop:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context {
#define MOVE_ANIMATION_DURATION_SECONDS 0.15
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:MOVE_ANIMATION_DURATION_SECONDS];
placardView.transform = CGAffineTransformMakeScale(1.1f, 1.1f);
/*
Move the placardView to under the touch.
We passed the location wrapped in an NSValue as the context.
Get the point from the value, then release the value because we retained it in touchesBegan:withEvent:.
*/
NSValue *touchPointValue = (NSValue *)context;
placardView.center = [touchPointValue CGPointValue];
[touchPointValue release];
[UIView commitAnimations];
}
答案 13 :(得分:0)
替代方案1,2和4可能与计算机没有任何差异,但代码的其他读者也有。
由于https://stackoverflow.com/a/1521382和https://stackoverflow.com/a/16040884以及https://www.tutorialspoint.com/objective_c/objective_c_pointers.htm等解释使用了第一种选择:
1. NSString *string;
并且所有额外变量都需要自己的星号,如:
NSString *aString, *bString;
我的谦虚建议是我们使用备选方案1作为标准。