2014-01-13 671 views
5

例如,@(...)是什么意思?

CABasicAnimation *rotate = [CABasicAnimation animationWithKeyPath:@"transform.rotation"]; 
[rotate setToValue:@(M_PI)]; 
[rotate setDuration:0.1f];    
[[aView layer] addAnimation:rotate forKey:@"myRotationAnimation"]; 

其中M_PI被定义为在math.h一个宏,

#define M_PI 3.14159265358979323846264338327950288 /* pi */ 
+0

@(M_PI)是一个NSNumber的在这种情况下 – johnMa

+3

@johnMa事实上,@前缀(表达),其中@后跟圆括号中,将永远是一个数吧?方括号=数组,花括号=字典。 –

回答

5

这是一个指向NSNumber对象。这就是所谓的一个盒装文字,因为心理画面是把表达的原始值内成为一个“盒子”,也就是对象的。

official documentation如果有疑问。请注意,指针可以是一个“真正的” NSNumber对象,也可以(从理论上说,不知道这是否会在实际工作)是标记指针(参见,例如,my question)。

请注意,您也可以执行诸如@"string"@5之类的操作,它将在编译时创建常量。但是你需要括号来使用非文字的东西,例如@(2 + 3)。括号表单可以用于任何表达式,即使那些编译器在编译时不能计算的表达式(尽管它可以,它只会将表达式结果放入代码中)。

1

它表示ID对象

,可以使用任何表达它或返回任何目的。

语法:@(<#expression#>)它会返回id对象。

所以在你的情况下,它会返回NSNumber对象到setToValue方法。

+0

有没有这样的事情'ID'对象;根据定义,任何对象都有一个类。 –

+0

@ilyan。 : 不同意。 –

+1

“一个id类型可以容纳任何对象的指针”我相信会是一个更好的表达。同样,'@(something)'构造只会创建'NSNumber'实例。 –

1

这是速记书写

在Objective-C,任何characternumericboolean文字与'@'字符前缀将评估为一个指向NSNumber object(在这种情况下),用该值进行初始化。 C的类型后缀可以用来控制文字的大小。

'@'在Objective-C世界中被广泛使用。它主要用于避免使用英文单词并保留它们(例如,在C/Objective-C中不能使用名为float的变量,因为这是一个保留字)。使用this link To have detailed knowledge of '@' symbol

在现代物镜C中,'@'符号被广泛使用。

什么,你可以用它做什么:

  • 计算表达式:@(<Expression>)
  • 包装在同样的方式

原因如int,BOOL,浮法,字符的任意值使用方法:

  • 易于编写,需要较少的代码
  • 错误的机会较少。将[NSNumber numberWithInt:3]@3进行比较。
  • 摆脱简单情况下的类型转换问题。
+0

小调:这不是以'@'作为前缀的前缀。文字就像'@ 3.14'。这是盒装表达。这就是为什么它需要括号。 –

+0

@ilyan。是的。但我试图给出一个通用的答案。我打算告诉PO为什么在Objective C中使用了'@'符号。所以我从Literals开始,并以表达式结束。让我知道如果我错了。 –

+0

它不需要括号,@ilya;尝试一下。 '@ M_PI'编译得很好,因为预处理器在编译器到达之前已经将文字写入了。如果它是一个变量而不是一个宏,则需要使用圆括号。 –

5

NeXT和Apple Obj-C运行时长期以来一直使用文字语法@"a new string"来创建新字符串。使用这种格式可以让程序员在做某些操作时不必使用更长的initWithString或类似的方法。

使用Apple LLVM编译器时4。0或更高版本,数组,字典和数字(NSArray,NSDictionary,NSNumber类)也可以使用文字语法而不是方法创建。文字语法使用@符号与[],{},()结合分别创建上述类。

所以,基本上它不仅为idNSNumber对象!

感谢wiki

+0

只是想补充'@“字符串”'是在编译时创建'NSString'字面值的结构; '@(表达式)'或者'@ [items]'框在运行时。 –