所以我明白在ObjC中所有东西都存在于堆中,而且一切都有指向它的指针。我正在阅读O'Reilys的书,我正在抓住大部分内容,但是当我按照教程/示例进行操作时会出现类似的内容
NSMutableArray *bar = [[[foo alloc] init] callMethod];
*
就在bar
旁边,但是你有
- (NSString *)createDeck:(NSString *)numOfCards;
为什么NSString *
而不是- (NSString)*createDeck:(NSString)*numOfCards;
?
任何帮助都能理解概念,非常感谢。
编辑:
NSUInteger *randomIndex = arc4random() % [deck count];
如何
NSUInteger randomIndex = arc4random() % [deck count];
工作正常,在这种情况下如何删除指针有效?
答案 0 :(得分:5)
类型为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 *
。
使用哪一个是个人品味的纯粹问题,即使我相信第一个是最常见的。