gpt4 book ai didi

objective-c - 难以理解 Objective-C 中的指针

转载 作者:行者123 更新时间:2023-12-02 04:46:08 28 4
gpt4 key购买 nike

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

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

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

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

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

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

编辑:

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

在哪里NSUInteger randomIndex = arc4random() % [deck count];工作正常,为什么在这种情况下删除指针有效?

最佳答案

tl;dr

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

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

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

关于最后一个问题,NSUInteger 不是一个对象,尽管命名可能有不同的含义。作为原生类型,它存在于堆栈中,您不需要指向它的指针。

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


讨论

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 *

使用哪一个纯粹是个人品味问题,尽管我认为第一个是最常见的。

关于objective-c - 难以理解 Objective-C 中的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19762133/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com