0

我最近拿起了 BigNerdRanch 关于 Cocoa for Mac OSX 的书,我正在寻找一个关于星号和下划线使用的很好的解释,这些星号*和下划线_似乎在整个语言中的使用不一致。一些例子:

这些似乎在功能上是等效的:

NSString* myString;
NSString *myString;

有时新变量会带有下划线,而其他变量则不会:

NSString _myString;
NSString myString;

有时它会变得很疯狂:

NSString *myString;
NSString *_myString;

我还看到了方法中带有星号的变化:

- (void)speechSynthesizer:(NSSpeechSynthesizer *)sender
            willSpeakWord:(NSRange)characterRange
                 ofString:(NSString *)string;

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

4

2 回答 2

2

指示一个指针,*所有 Objective-C 对象都是。(您在内存中传递指向这些对象的指针)。在基本级别上,这些是普通的 C 指针。如果我没记错的话,您可以通过 go 访问 Objective-C 对象中的一些数据object->data,就像使用指向 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 *

于 2012-05-03T01:01:15.553 回答
0

作为 Ryan 答案的附录,当您看到类似

-(void)speechSynthesizer:(NSSpeechSynthesizer *)sender willSpeakWord:(NSRange)character
RangeofString:(NSString *)string;

诸如(NSSpeechSynthesizer *)sender仅说明参数的类型之类的东西-在这种情况下是 NSSpeechSynthesizer*

于 2012-05-04T00:35:34.667 回答