我最近在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;
那么星号或下划线的功能用途是什么,你何时应该使用(或不使用),何时应该组合使用?
答案 0 :(得分:2)
*
表示一个指针,所有Objective-C对象都是指针。 (你在内存中传递指向这些对象的指针)。在基本级别,这些是正常的C指针。如果我没记错的话你可以通过object->data
来访问Objective-C对象中的一些数据,就像使用指向C结构的指针一样。
_
是一个Cocoa(以及其他一些语言)约定,意思是“应该被认为是该对象专用的一段数据”。
Objective-C有@private
声明,但它也是该语言的一个相对较新的补充 - 如果你的代码超过2或3年(或者针对OS X的旧版本),它可能不会使用@private
由于最初缺乏语言基础设施,Cocoa社区常常使用_
来标记“嘿,你可能不应该直接设置或阅读这个,请”。
所以:
*
来跟随类名(如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 *
。
答案 1 :(得分:0)
作为Ryan回答的附录,当你看到类似
的内容时-(void)speechSynthesizer:(NSSpeechSynthesizer *)sender willSpeakWord:(NSRange)character
RangeofString:(NSString *)string;
像(NSSpeechSynthesizer *)sender
之类的东西只是声明参数的类型 - 在本例中是NSSpeechSynthesizer *