难以理解Objective-C中的指针

时间:2013-11-04 05:29:52

标签: 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]; Error

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

1 个答案:

答案 0 :(得分:5)

TL;博士

类型为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 *

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