我为什么不用*声明NSInteger

时间:2009-06-18 17:29:22

标签: objective-c cocoa pointers integer nsinteger

我正试着在iTunes U上从斯坦福大学学习iPhone课程,我对指针感到有些困惑。在第一个作业中,我尝试过做这样的事情

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

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

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

  

与网络开发不同,我现在需要   担心内存,嗯,比在Web开发中更多。所以,当我   创建一个变量,它被分配了一个   有点内存(RAM I   假设)。而不是通过   变量周围,我传递一个指针   那段记忆。和   指针是通过前缀来声明的   带*的变量名。

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

5 个答案:

答案 0 :(得分:68)

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

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

返回实际变量,而不是其地址。要解决此问题,您需要删除*

NSInteger processID = [[NSProcessInfo processInfo] processIdentifier];

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

NSInteger *pointerToProcessID = &processID;

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

答案 1 :(得分:25)

您没有使用NSInteger声明*的原因是因为它不是对象。 NSInteger只是intlong

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

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

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

另一方面,

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

答案 2 :(得分:3)

*表示“指针”。对象变量包含指向对象的指针,因此它具有*; NSInteger变量包含NSInteger,而不是指向NSInteger的指针,因此它没有*。将*放在该变量上会给你至少一个警告,因为你将一个整数放入一个指针变量。

答案 3 :(得分:2)

NSInteger只是int,AFAIK的一个typedef。

答案 4 :(得分:0)

使用指针

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