Obj-C:“Fairfield”和@“Fairfield”之间的区别(带字符串)?

时间:2009-11-01 03:30:14

标签: iphone objective-c nsstring

我的iPhone应用程序answered here中只有一个非常糟糕的拼写错误。

现在我想知道@“......”符号。

为什么会这样:

NSArray *someArray = [NSArray arrayWithObjects: @"Fairfield", nil];

并且这没有(即使它编译,它将抛出一个EXC_BAD_ACCESS):

NSArray *someArray = [NSArray arrayWithObjects: "@Fairfield", nil];

修改

好的,所以你们已经指出我不能将一个C字符串添加到NSArray中,因为它显然不是一个对象。

现在另一个问题:这不是一种疏忽吗?我的意思是,为什么“... WithObjects:”消息指定(id)而不是(NSObject *)的列表?

4 个答案:

答案 0 :(得分:10)

"@Fairfield"是一个普通的C字符串,其中包含一个“@”字符。 @"Fairfield"是一个Objective-C字符串(OS X上为NSString),其中没有文字“@”。

您不能将C字符串添加到Cocoa集合中。

答案 1 :(得分:4)

它接受id而不是NSObject,因为所有初始化工具都会返回id。所有初始化程序都返回id,因为子类会覆盖其祖先初始化程序的返回类型。

例如,-[NSMutableString init]无法返回NSMutableString *,因为它是-[NSString init]的子类,它不能返回NSString *,因为它会覆盖-[NSObject init]

不幸的是,const char *id之间的隐式类型转换是完全合法的,因此编译器不会发出警告,但是静态分析器可能能够公平地选择这种错误容易。

答案 2 :(得分:3)

"Fairfield"是一个C字符串,@"Fairfield"是一个Objective-C字符串。

@"Fairfield"是一个对象(NSString),因此您可以发送方法([@"Fairfield" uppercaseString])并将其添加到Objective-C数组([NSArray arrayWithObjects:@"Fairfield",nil])。您只能向NSArrays添加对象。

另一方面,"Fairfield"是一个C字符串,通常不在Cocoa中使用。在大多数情况下,只需使用@"Fairfield"

即可

答案 3 :(得分:1)

Cocoa中的许多内容处理id而不是NSObject*的另一个原因是,与其他语言(例如Java和C#)不同,语言中的所有对象都必须继承从一些全局基类中,完全有可能让对象不是来自NSObjectNSProxy是一个例子)。这不是你经常做的事情,但它是可能的。 id类型表示“指向任何Objective C实例的指针”。