我最近在Mac OSX的Cocoa上找到了BigNerdRanch书,正在寻找关于星号*
和下划线_
在整个语言中用法不一致的很好的解释。一些例子:
这些在功能上似乎是等效的:
NSString* myString;
NSString *myString;
有时,新变量会带有下划线,而其他变量则不会:
NSString _myString;
NSString myString;
有时它变得疯狂:
NSString *myString;
NSString *_myString;
我还看到方法中带有星号的变体:
- (void)speechSynthesizer:(NSSpeechSynthesizer *)sender
willSpeakWord:(NSRange)characterRange
ofString:(NSString *)string;
那么,星号或下划线的功能用途是什么?什么时候该使用(或不该使用),以及何时应将它们组合使用?
最佳答案
*
指示所有Objective-C对象的指针。 (您将指针传递给内存中的这些对象)。从根本上讲,它们是普通的C指针。如果我没记错的话,您可以通过object->data
访问Objective-C对象中的某些数据,就像处理C结构的指针一样。_
是可可(和其他一些语言)约定,表示“应视为该对象私有的一段数据”。
Objective-C有一个@private
声明,但它也是对该语言的一个较新的补充-如果您的代码使用了2或3年以上(或针对OS X的较旧版本),则可能不使用@private
由于最初缺乏语言基础结构,可可社区经常使用_
来标记“嘿,您可能不应该直接设置或阅读它”。
所以:
在处理Objective-C类时,您始终需要*
跟随类名(例如NSString
),因为它们始终是指针。我对您代码中的NSString somestring
行感到困惑-要么生成一个编译警告,要么在您尝试使用它时崩溃_
表示私有数据。您将在Objective-C类的NSString* _name
部分中执行类似@interface
的操作。如果要在类的方法中调用或操作该数据,则应单独使用_name
。
假设您创建了一个Student类:
// Student.h
@interface Student : NSObject {
NSString* _name;
}
- (NSString*) name_as_caps;
@end
// Student.m
@implementation Student
- (NSString*) name_as_caps {
return [_name uppercase];
}
在这里,我们声明一个带有“私有”数据成员的类:
_name
。我们的Student
类由于某种原因需要返回大写字母,因此我们创建了一个方法来执行此操作,我们使用_name
并在其上调用uppercase
方法。我们需要在这里多次引用类型(或类名)或_name:一次,以声明变量。对于
name_as_caps
,我们需要说:this method returns a pointer to an NSString object
,因此我们使用了NSString *
。