在Objective-C中放置星号

我刚刚开始学习Objective-C,来自VB .Net和C#.Net背景。 我理解指针的用法,但是在Objective-C的例子中,我看到星号被放置在几个不同的地方,并且尽可能地search,我还没有find答案。 我尝试的每一个search都会提供关于指针的各种解释(我真的不需要),但没有提到星号不同位置的原因/效果。 以下是我见过的一些例子:

NSString *string; NSString * string; (NSString *) string; NSString* string; 

星号的这些不同的位置是什么意思? 我相信这是一个简单的答案,但是令人沮丧的是无法在任何Apple教程和参考文档中find它,或者到目前为止在线。

有人能结束我的痛苦,并回答这个令人困惑的问题吗? 谢谢!

没有什么区别,但是你应该知道,只有第一个“令牌”(可以这么说)定义了types名称,而*不是types名称的一部分。 也就是说:

 NSString *aString, bString; 

创build一个指向NSString指针和一个NSString 。 为了使两者都成为指针,请执行以下操作之一:

 NSString *aString, *bString; 

要么:

 NSString *aString; NSString *bString; 
 1. NSString *string; 2. NSString * string; 3. (NSString *) string; 4. NSString* string; 

1,2和4是完全一样的。 这都是风格。 select任何你想要的,或混合起来。

select#3还有另一个含义,它用于铸造。 例如:

 t = (NSString *)string ; 

string转换为NSString指针。

但select3是在.h文件中或在.m文件的函数定义中可能使用的语法。 在一个实际的函数中,在“运行”的代码中有不同的含义。

没有区别 – 这是一个风格问题。 它们都声明一个名为string的variables,它是一个指向NSString的指针。 在某些情况下(特别是方法声明),括号是必要的,以便阐明它是一个types声明。

你放星号的地方并不重要,所有的语句都会创buildNSStringtypes的指针。

当在一行中使用多个variables名称时,您必须为每个variables编写星号。

 NSString * nsstring, * nsstring2; 
 1. NSString *string; 2. NSString * string; 3. (NSString *) string; 4. NSString* string; 

1,2和4是等同的。 C语言(和C的Objective-C超集)指定了一个对空白不敏感的语法。 所以你可以自由地添加你select的空间作为风格的问题。 所有相关的语法都由非空白字符(例如{} ,;等)分隔[1]。

3是一种types转换(告诉C编译器使用NSString*types,而不pipe声明的string什么types)在Objective-C中,对象实例的types转换是很less需要的,你可以使用idtypes作为可以引用的variables任何对象types的实例。

在方法声明中,使用语法3(有时没有结尾分号)来声明方法参数的types。 Objective-C方法可能如下所示:

 - (void)myMethodThatTakesAString:(NSString*)string; 

在这个声明中,名为string的参数的types是NSString*types(前导-表示实例方法与类方法相对)。 具有多个参数的方法声明可能如下所示:

 - (void)myMethodTakingAString:(NSString*)string andAnInteger:(NSInteger)intParam; 

[1]这与Python使用空格作为块分隔符的语言进行了比较。

没有什么区别, *放在指针声明中是不相关的。

没有区别,空白位置是不相关的。

绝对没有区别。 NSString * mystring和NSString * myString是相同的。

其实所有的等价物:指向一个nsstring的指针!

*的工作方式与标准C中的相同

这是一个很好的入门,把*放在不同的地方,它是什么: http : //boredzo.org/pointers/

这些绝对没有区别。

1,2和4是等效的,并定义一个指向NSString的指针。 我的个人偏好是尽可能模仿K&R,所以我喜欢使用NSString *string;

(NString*)string; 尽pipe一个有效的陈述,本身并没有真正做任何事情。

 $ 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 

在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]; } 

计算机的替代scheme1,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;

所有额外的variables都需要自己的星号,如:

NSString *aString, *bString;

我卑微的build议是我们使用替代scheme1作为标准。