当前位置:  开发笔记 > IOS > 正文

我为什么不用*声明NSInteger

如何解决《我为什么不用*声明NSInteger》经验,为你挑选了2个好方法。

我正试着在iTunes U上从斯坦福大学开始学习iPhone课程,我对指针感到有些困惑.在第一次任务中,我尝试过做这样的事情

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

这产生了一个错误,在盲目地修复之后,我发现它是导致问题的NSInteger系列中的*.

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

与Web开发不同,我现在需要担心内存,而不是Web开发.因此,当我创建一个变量时,它会在某处分配一些内存(我假设是RAM).我没有传递变量,而是将指针传递给周围的内存.并且通过在变量名前加上*来声明指针.

假设我是对的,让我感到困惑的是为什么我不需要为NSInteger做那个?



1> Dan Lorenc..:

NSInteger是一种原始类型,这意味着它可以本地存储在堆栈中.您不需要使用指针来访问它,但如果您愿意,也可以.这条线:

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

返回一个实际变量,而不是它的地址.要解决此问题,您需要删除*:

NSInteger processID = [[NSProcessInfo processInfo] processIdentifier];

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

NSInteger *pointerToProcessID = &processID;

&符号是运算符的地址.它将指针设置为NSInteger等于内存中变量的地址,而不是变量中的整数.


那是无效的.&运算符需要左值,而方法调用是右值.
如果Apple-双击NSInteger或其他类型你在XCode中感到困惑,你可以得到它的定义,在这种情况下将是:typedef int NSInteger; 所以这毕竟是一个普通的老int.
当我从webdev转向iPhone开发时,这对我来说是一个重大问题.另一个需要注意的是确保用nil终止NSArray.

2> Alex Rozansk..:

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

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

如果它在32位应用程序中使用,它是一个32位整数,如果它是在64位应用程序中构建的,那么它是一个64位整数.

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

另一方面,对象只能作为指针传递给其他函数.这是因为对象具有为它们动态分配的内存,因此无法在堆栈上声明.由于为它们分配intlong具有固定数量的内存,因此这不是问题.

推荐阅读
kikokikolove
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有