难以理解Objective-C中的指针

Dat*_*sik 2 objective-c

所以我明白在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]; 工作正常,在这种情况下如何移除指针有效?

Gab*_*lla 5

TL;博士

类型是NSString *,这就是你的原因

- (NSString *)createDeck:(NSString *)numOfCards;
Run Code Online (Sandbox Code Playgroud)

返回类型和参数类型括在括号内.

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

如果你cmd-单击类型名称,你会发现它实际上是一个typedef unsigned int(或者unsigned long,取决于架构).


讨论

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

NSString * bar;
^^^^^^^^^^ ^^^
  type      identifier
Run Code Online (Sandbox Code Playgroud)

没有标识符的声明符称为抽象声明符,在三种情况下通常用于C:

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

- (NSString *)createDeck:(NSString *)numOfCards;
Run Code Online (Sandbox Code Playgroud)

(关于声明者的大部分信息都改编自http://nilsou.com/blog/2013/08/21/objective-c-blocks-syntax/)


关于星号的位置,

NSString *bar;
NSString * bar;
NSString* bar;
Run Code Online (Sandbox Code Playgroud)

是所有有效的方法来声明一个指向NSString的类型指针的变量,也就是说NSString *.

哪一个使用的是个人品味的纯粹问题,即使我相信第一个是最常见的.