我想我的手在斯坦福大学的iPhone当然在iTunes U和我有点困惑指针。 在第一次任务,我试图做这样的事情
NSString *processName = [[NSProcessInfo processInfo] processName];
NSInteger *processID = [[NSProcessInfo processInfo] processIdentifier];
其产生的错误,盲目地tinkeing左右后,我发现它是在NSInteger的行是造成问题的*。
所以,我显然不明白发生了什么。 我将解释如何,我认为它的工作原理,也许有人会好心地指出缺陷。
不像在网络的发展,我现在需要担心内存,很好,远远超过在web开发。 所以,当我创建一个变量,它被分配了一点记忆的地方(RAM我假设)。 代替围绕传递变量的,我将指针传递给的存储器该比特左右。 和指针的前缀来*变量名声明。
假设我是对的,令我百思不解的是,为什么没有我需要做的是为NSInteger的?
NSInteger
是一个基本类型,这意味着它可以在本地在堆栈上存储 。 你并不需要使用一个指针来访问它,但你可以,如果你想。 该行:
NSInteger *processID = [[NSProcessInfo processInfo] processIdentifier];
返回一个实际的变量,而不是它的地址。 为了解决这个问题,你需要删除*
:
NSInteger processID = [[NSProcessInfo processInfo] processIdentifier];
你可以有一个指向NSInteger
,如果你真的想要一个:
NSInteger *pointerToProcessID = &processID;
和符号是运营商的地址。 它设置指针NSInteger
等于变量在内存中,而不是在该变量中的整数的地址。
你不申报的原因NSInteger
有*
是因为它是不是一个对象。 一个NSInteger是一个简单的int
或long
:
#if __LP64__
typedef long NSInteger;
#else
typedef int NSInteger;
endif
如果它在32位应用程序被使用,这是一个32位的整数,并且如果它被内置于64位应用程序,这是一个64位的整数。
当然,你可以传递一个NSInteger
一个指针,但多数功能简单地采取参数作为一个NSInteger
,而不是一个指针。
对象,在另一方面,只能传递给其它功能的指针。 这是因为对象有内存动态分配给他们,所以不能在堆栈上声明。 因为一个int
或long
有分配给他们的内存固定的数额,这是不是一个问题。
在*
的意思是“指针”。 对象变量保存一个指针到一个对象,所以它有一个*
; 在NSInteger的变量包含一个NSInteger,而不是指向一个NSInteger,所以它不会有一个*
。 把*
该变量为您提供了至少一个警告,因为你把一个整数为指针变量。
NSInteger的仅仅是INT一个typedef,据我所知。
有工作的指针
NSInteger integer1 = 1;
NSLog(@"1. integer1:%ld &integer1:%p", integer1, &integer1);
//1. integer1:1 &integer1:0x7ffee59e8a98
NSInteger *integer2 = &integer1;
NSLog(@"2. integer2:%p &integer2:%p *integer2:%ld", integer2, &integer2, *integer2);
//2. integer2:0x7ffee59e8a98 &integer2:0x7ffee59e8a90 *integer2:1
*integer2 = 2;
NSLog(@"3. integer2:%p &integer2:%p *integer2:%ld \t integer1:%ld &integer1:%p", integer2, &integer2, *integer2, integer1, &integer1);
//3. integer2:0x7ffee59e8a98 &integer2:0x7ffee59e8a90 *integer2:2 integer1:2 &integer1:0x7ffee59e8a98