gar*_*uan 42 cocoa pointers integer objective-c nsinteger
我正试着在iTunes U上从斯坦福大学开始学习iPhone课程,我对指针感到有些困惑.在第一次任务中,我尝试过做这样的事情
NSString *processName = [[NSProcessInfo processInfo] processName];
NSInteger *processID = [[NSProcessInfo processInfo] processIdentifier];
Run Code Online (Sandbox Code Playgroud)
这产生了一个错误,在盲目地修复之后,我发现它是导致问题的NSInteger系列中的*.
所以我显然不明白发生了什么.我将解释我认为它是如何工作的,也许有人会善意地指出这个缺陷.
与Web开发不同,我现在需要担心内存,而不是Web开发.因此,当我创建一个变量时,它会在某处分配一些内存(我假设是RAM).我没有传递变量,而是将指针传递给周围的内存.并且通过在变量名前加上*来声明指针.
假设我是对的,让我感到困惑的是为什么我不需要为NSInteger做那个?
Dan*_*enc 70
NSInteger是一种原始类型,这意味着它可以本地存储在堆栈中.您不需要使用指针来访问它,但如果您愿意,也可以.这条线:
NSInteger *processID = [[NSProcessInfo processInfo] processIdentifier];
Run Code Online (Sandbox Code Playgroud)
返回一个实际变量,而不是它的地址.要解决此问题,您需要删除*:
NSInteger processID = [[NSProcessInfo processInfo] processIdentifier];
Run Code Online (Sandbox Code Playgroud)
你可以有一个指针,NSInteger如果你真的想要一个:
NSInteger *pointerToProcessID = &processID;
Run Code Online (Sandbox Code Playgroud)
&符号是运算符的地址.它将指针设置为NSInteger等于内存中变量的地址,而不是变量中的整数.
Ale*_*ski 25
你不用NSIntegera 声明的原因*是因为它不是一个对象.NSInteger只是一个int或一个long:
#if __LP64__
typedef long NSInteger;
#else
typedef int NSInteger;
endif
Run Code Online (Sandbox Code Playgroud)
如果它在32位应用程序中使用,它是一个32位整数,如果它是在64位应用程序中构建的,那么它是一个64位整数.
当然,您可以传递NSInteger一个指针,但大多数函数只是将参数作为一个NSInteger而不是指向它的指针.
另一方面,对象只能作为指针传递给其他函数.这是因为对象具有为它们动态分配的内存,因此无法在堆栈上声明.由于为它们分配int或long具有固定数量的内存,因此这不是问题.
| 归档时间: |
|
| 查看次数: |
32499 次 |
| 最近记录: |