Objective-C中的@运算符与& C中的运算符?

时间:2011-04-26 20:46:09

标签: objective-c pointers nsstring

新目标C.试图理解目标C中的指针。

我的代码

#import <Foundation/Foundation.h>

 int main (int argc, const char * argv[]) {

    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

NSString *msg = @"Hello Bhai";
NSLog(@" address is %i for msg", msg);
NSLog(@" which is same address  %i for Hello Bhai", @"Hello Bhai");
NSLog(@" which is different address  %i for Hello mere Bhai", @"Hello mere Bhai");
NSLog(@" value is %@ at the address for msg", msg);


[pool drain];
    return 0;
}

输出

[Session started at 2011-04-26 16:31:11 -0400.]
2011-04-26 16:31:11.656 BasicObjC[1523:10b]  address is 8240 for msg
2011-04-26 16:31:11.658 BasicObjC[1523:10b]  which is same address  8240 for Hello Bhai
2011-04-26 16:31:11.659 BasicObjC[1523:10b]  which is different address  8288 for Hello mere Bhai
2011-04-26 16:31:11.660 BasicObjC[1523:10b]  value is Hello Bhai at the address for msg

这是否意味着目标C中的@与&amp;在C

4 个答案:

答案 0 :(得分:5)

@用于表示该字符串是NSString文字,因此您可以将其分配给NSString对象。

如果要打印某个地址,则应使用%p格式说明符,而不是%i,例如

NSLog(@" address is %p for msg", msg);

答案 1 :(得分:4)

  

这是否意味着目标C中的@与&amp;在C

不,在此上下文中,'@'用于区分NSString文字与C char数组,以便您可以选择使用objective-c NSStrings而不是C字符串。

在格式字符串'%@'中用于获取NSObject的字符串表示形式(来自其“description”方法),因此您可以将其输出到控制台。

您也遇到了NSString文字的特殊行为。你的两个@“Hello Bhai”字符串指针只引用相同的内存地址,因为NSString被优化为不创建相同的字符串文字副本。其他对象不一定表现相同。通常,您不需要了解这种优化,因为在使用这些对象时不应该有任何区别。如果您正确地遵循与任何其他对象相同的保留/释放规则和比较,那么您将永远不会注意到差异。

答案 2 :(得分:2)

at符号(@)与&运算符完全不同。 @"…"语法是从引号中给出的字符创建NSString实例的简写。

答案 3 :(得分:2)

一般情况下,您会看到@符号在Objective-C中使用了很多位置,因为该语言特有的语法因此在“普通”C中不合法:

@implementation
@interface
@property
@selector
@class

正如其他所有人所指出的那样,在这个特定情况下,@"This is a string.",它用于指示Objective-C字符串文字的开头。它也用作格式说明符%@来表示“对象”。

@最初是出于这些目的而选择的,因为不是用于C中的任何内容。“address-of”运算符&在Objective-中完全合法C *,因为Obj-C是C的超集。


*实际上,它经常在Cocoa中用于间接返回值;例如,请参阅Error Handling