我为什么不宣布NSInteger的有*(Why don't I declare NSInte

2019-06-23 14:31发布

我想我的手在斯坦福大学的iPhone当然在iTunes U和我有点困惑指针。 在第一次任务,我试图做这样的事情

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

其产生的错误,盲目地tinkeing左右后,我发现它是在NSInteger的行是造成问题的*。

所以,我显然不明白发生了什么。 我将解释如何,我认为它的工作原理,也许有人会好心地指出缺陷。

不像在网络的发展,我现在需要担心内存,很好,远远超过在web开发。 所以,当我创建一个变量,它被分配了一点记忆的地方(RAM我假设)。 代替围绕传递变量的,我将指针传递给的存储器该比特左右。 和指针的前缀来*变量名声明。

假设我是对的,令我百思不解的是,为什么没有我需要做的是为NSInteger的?

Answer 1:

NSInteger是一个基本类型,这意味着它可以在本地在堆栈上存储 。 你并不需要使用一个指针来访问它,但你可以,如果你想。 该行:

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

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

NSInteger processID = [[NSProcessInfo processInfo] processIdentifier];

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

NSInteger *pointerToProcessID = &processID;

和符号是运营商的地址。 它设置指针NSInteger等于变量在内存中,而不是在该变量中的整数的地址。



Answer 2:

你不申报的原因NSInteger*是因为它是不是一个对象。 一个NSInteger是一个简单的intlong

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

如果它在32位应用程序被使用,这是一个32位的整数,并且如果它被内置于64位应用程序,这是一个64位的整数。

当然,你可以传递一个NSInteger一个指针,但多数功能简单地采取参数作为一个NSInteger ,而不是一个指针。

对象,在另一方面,只能传递给其它功能的指针。 这是因为对象有内存动态分配给他们,所以不能在堆栈上声明。 因为一个intlong有分配给他们的内存固定的数额,这是不是一个问题。



Answer 3:

*的意思是“指针”。 对象变量保存一个指针到一个对象,所以它有一个* ; 在NSInteger的变量包含一个NSInteger,而不是指向一个NSInteger,所以它不会有一个* 。 把*该变量为您提供了至少一个警告,因为你把一个整数为指针变量。



Answer 4:

NSInteger的仅仅是INT一个typedef,据我所知。



Answer 5:

有工作的指针

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


文章来源: Why don't I declare NSInteger with a *