对Cocoa语法中星号和下划线的澄清

时间:2012-05-03 00:41:43

标签: objective-c ios macos cocoa

我最近在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;

那么星号或下划线的功能用途是什么,你何时应该使用(或不使用),何时应该组合使用?

2 个答案:

答案 0 :(得分:2)

*表示一个指针,所有Objective-C对象都是指针。 (你在内存中传递指向这些对象的指针)。在基本级别,这些是正常的C指针。如果我没记错的话你可以通过object->data来访问Objective-C对象中的一些数据,就像使用指向C结构的指针一样。

_是一个Cocoa(以及其他一些语言)约定,意思是“应该被认为是该对象专用的一段数据”。

Objective-C有@private声明,但它也是该语言的一个相对较新的补充 - 如果你的代码超过2或3年(或者针对OS X的旧版本),它可能不会使用@private

由于最初缺乏语言基础设施,Cocoa社区常常使用_来标记“嘿,你可能不应该直接设置或阅读这个,请”。

所以:

  • 在处理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 *

答案 1 :(得分:0)

作为Ryan回答的附录,当你看到类似

的内容时
-(void)speechSynthesizer:(NSSpeechSynthesizer *)sender willSpeakWord:(NSRange)character
RangeofString:(NSString *)string;
(NSSpeechSynthesizer *)sender之类的东西只是声明参数的类型 - 在本例中是NSSpeechSynthesizer *