2

所以我明白,在 ObjC 中,一切都存在于堆中,一切都有指向它的指针。我正在阅读 O'Reilys 的书,并且掌握了大部分内容,但是当我阅读教程/示例时,就会出现类似的情况

NSMutableArray *bar = [[[foo alloc] init] callMethod];

就在*旁边bar,但是你有类似的东西

- (NSString *)createDeck:(NSString *)numOfCards;

为什么是NSString *和不是- (NSString)*createDeck:(NSString)*numOfCards;

任何帮助理解事物概念都会非常感谢。

编辑:

NSUInteger *randomIndex = arc4random() % [deck count]; 错误

作为 Where NSUInteger randomIndex = arc4random() % [deck count]; Works 正常,在这种情况下删除指针如何工作?

4

1 回答 1

5

tl;博士

类型是NSString *,这就是为什么你有

- (NSString *)createDeck:(NSString *)numOfCards;

返回类型和参数类型包含在括号内。

关于最后一个问题,anNSUInteger不是对象,尽管命名可能暗示其他情况。作为本机类型,它存在于堆栈中,您不需要指向它的指针。

如果您在类型名称上单击 cmd,您会发现它实际上是一个 typedef unsigned int(或unsigned long,取决于体系结构)。


讨论

C 中的变量(以及因此在 Objective-C 中)是使用声明符声明的,声明符由类型和标识符组成。在您的示例NSString *中是类型并且bar是标识符。

NSString * bar;
^^^^^^^^^^ ^^^
  type      identifier

没有标识符的声明符称为抽象声明符,在 C 语言中常用的有以下三种情况:

  • 铸件

      float x = (float)2/4;
    
  • 的论点sizeof()

      sizeof(int *);
    
  • 声明函数的参数类型

      void foo(int *, float);
    

在 Objective-C 中,它们也用于方法的返回和参数类型,这就是为什么你有

- (NSString *)createDeck:(NSString *)numOfCards;

(大部分关于声明符的资料改编自http://nilsou.com/blog/2013/08/21/objective-c-blocks-syntax/


关于星号的位置,

NSString *bar;
NSString * bar;
NSString* bar;

都是声明指向 NSString 的类型指针变量的有效方法,也就是NSString *.

使用哪一个纯粹是个人喜好问题,尽管我相信第一个是最常见的。

于 2013-11-04T05:33:49.600 回答