为什么指针需要类型?

时间:2015-01-25 17:19:45

标签: objective-c

如果一个对象的实例变量只是指向其他对象的指针(如NSString),并且变量只保存一个引用,而不是对象本身,为什么它需要一个类型?或者为什么它的类型不像“NSReference”,因为那就是它?

例如,从“iOS编程:大书呆子牧场指南”:

在item.h中

#import <Foundation/Foundation.h>

@interface Item : NSObject
{
    NSString *_itemName;
    NSString *_serialNumber;
    int _valueInDollars;
    NSDate *_dateCreated;
}

@end

在我看来,每个变量的类型应该类似于NSReference。为什么实例变量声明为字符串,而日期和int如果只保存对字符串位置和date和int的引用,而不是字符串和日期以及int本身?

2 个答案:

答案 0 :(得分:1)

如果我从 C 的观点解释,那会容易一些。对于 objective-c ,它是相同的,因为它是基本 C 的包装。

在C

  • 字符是1个字节
  • 整数是2字节或4字节(取决于您的架构32/64位)

您可以将这两种类型的指针投射到void*中,如下所示:

int *p;
char *q;
void *a = p;
void *b = q;

将其转换为void*时,编译器无法确定实际数据类型是什么。您必须明确告诉编译器a&amp;的实际数据类型。 b是整数&amp;如果你想要检索它们指向的实际值,那就是字符。

例如:
说你的代码如下

int i = 0xABCD;//assume here that integer is 16 bit / 2 byte
int *p;
p = &i;//now the compiler know that the data type pointed by the p is an integer so read 2 byte as chunk to get the actual value.
void *v = p;

如果您真的有兴趣检索整数,则必须将其强制转换回int*以获取之前存储的值,如下所示:

int *q;
q = (int*)v;//now *q will give 0xABCD

如果你真的有兴趣玩void*之类的东西,请在objective-c中使用id,这与您正在搜索的NSReference更相似。

答案 1 :(得分:1)

id类型是您想要的类型。 id是指向对象的无类型/通用指针。

如果需要,可以使用它,但使用它有一个主要缺点:编译器将无法验证您是否正确使用了指针。例如:

id foo;
foo = [NSString stringWith....];
...
[foo convertFromPolarToCartesian];

在最后一条指令中,编译器将无法看到这不起作用,因为foo为无类型,并且不知道它指向的对象是否能够响应消息(我打赌) NSString没有这样的方法。)

尽可能快地检测程序中的错误非常重要,并且在编译时发现错误是正确的选择,所以即使可以使用通用指针也不要使用它们如果你知道他们必须指出的那种对象。这不会涵盖所有可能的错误,而是愚蠢的错误。