为什么我不把NSInteger声明为*

我在iTunes U上试图从斯坦福大学的iPhone课程,我对指针有些困惑。 在第一个任务中,我试着做这样的事情

NSString *processName = [[NSProcessInfo processInfo] processName]; NSInteger *processID = [[NSProcessInfo processInfo] processIdentifier]; 

哪一个产生了一个错误,经过盲目的调味,我发现这是NSInteger系列中的*导致的问题。

所以我显然不明白发生了什么事情。 我会解释我认为它是如何工作的,也许有人会善意指出这个缺陷。

与网站开发不同的是,我现在需要担心内存,而不是在Web开发中。 所以当我创build一个variables的时候,它被分配了一些内存(RAM我认为)。 我不是传递variables,而是传递一个指向这个位的指针。 指针是通过在variables名前加*来声明的。

假设我是对的,那么为什么我不需要为NSInteger做这件事呢?

NSInteger是一个原始types,这意味着它可以在本地存储在堆栈上 。 您不需要使用指针来访问它,但是如果您想要,也可以使用。 该行:

 NSInteger *processID = [[NSProcessInfo processInfo] processIdentifier]; 

返回一个实际的variables,而不是它的地址。 要解决这个问题,你需要删除*

 NSInteger processID = [[NSProcessInfo processInfo] processIdentifier]; 

如果你真的想要一个指针,你可以有一个指向NSInteger的指针:

 NSInteger *pointerToProcessID = &processID; 

&号是运营商的地址。 它将指向NSInteger的指针设置为等于内存中variables的地址,而不是variables中的整数。

你不用*声明NSInteger的原因是因为它不是一个对象。 一个NSInteger只是一个int或一个long

 #if __LP64__ typedef long NSInteger; #else typedef int NSInteger; endif 

如果它在32位应用程序中使用,则它是一个32位整数,如果它是在64位应用程序中构build的,则是一个64位整数。

当然,你可以传递一个NSInteger作为指针,但是大多数函数只是将参数作为一个NSInteger而不是一个指向它的指针。

另一方面,对象只能作为指针传递给其他函数。 这是因为对象具有为其dynamic分配的内存,所以不能在堆栈上声明。 由于intlong具有为其分配的固定内存量,所以这不是问题。

NSInteger只是intA的typedef,AFAIK。

*表示“指针”。 对象variables包含一个指向对象的指针,所以它有一个* ; NSIntegervariables包含一个NSInteger,而不是一个指向NSInteger的指针,所以它没有* 。 把*放在那个variables上会给你至less一个警告,因为你把一个整数放到一个指针variables中。