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

10-08 09:26
查看更多