我的iPhone应用程序answered here中只有一个非常糟糕的拼写错误。
现在我想知道@“......”符号。
为什么会这样:
NSArray *someArray = [NSArray arrayWithObjects: @"Fairfield", nil];
并且这没有(即使它编译,它将抛出一个EXC_BAD_ACCESS):
NSArray *someArray = [NSArray arrayWithObjects: "@Fairfield", nil];
修改
好的,所以你们已经指出我不能将一个C字符串添加到NSArray中,因为它显然不是一个对象。
现在另一个问题:这不是一种疏忽吗?我的意思是,为什么“... WithObjects:”消息指定(id)而不是(NSObject *)的列表?
答案 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#)不同,语言中的所有对象都必须继承从一些全局基类中,完全有可能让对象不是来自NSObject
(NSProxy
是一个例子)。这不是你经常做的事情,但它是可能的。 id
类型表示“指向任何Objective C实例的指针”。