解释对象变量声明和赋值

时间:2011-11-01 23:34:15

标签: objective-c object pointers syntax

在此片段中:

NSString *testString; 
testString = [[NSString alloc] init]; 

为什么在第二行,我们不必编写*testString = ...来访问它实际指向的位置?

在第一行之后,*testString是什么,testString是什么?

4 个答案:

答案 0 :(得分:2)

您要创建NSString类型指针的第一行。在声明它们时,C ++和Objective-C中的指针用星号(*)表示。第二行你说这个名为“testString”的指针引用了你在内存中分配的NSString对象的内存位置。

答案 1 :(得分:2)

所有对象都由指针引用。第一行

NSString * testString;

声明实例变量。如果您的变量类型是一个对象(除了类型ID),您需要*

从那时起对testString的引用就是指针

如果您创建2个字符串。创建了2个物理对象(在内存中)

NSString * testString = [[NSString alloc] init];
NSString * testString2 = [[NSString alloc] init];

//setting testString to testString2 will lose the pointer to testString for good

testString = testString2;  //<--bad if you still care about testString (and leaks the memory too)

我建议查看关于Objective-C的Apple指南。特别是本节

http://developer.apple.com/library/mac/#documentation/cocoa/conceptual/objectivec/Chapters/ocObjectsClasses.html#//apple_ref/doc/uid/TP30001163-CH11-SW1

答案 2 :(得分:1)

这只是因为我们影响指针。

[[NSString alloc] init]返回指向NSString的指针。

在Cocoa中,每个对象都是动态分配的(如在C中的malloc中),并且每个NSObject都通过其指针/地址进行操作(在许多ObjC程序员甚至不知道的情况下)他们操纵指针而不是对象)

答案 3 :(得分:1)

  

为什么在第二行,我们不必编写*testString = ...来访问它实际指向的位置?

init方法返回指向对象的通用指针 - 其返回类型为idtestString是指向NSString的指针,它是一个对象,因此您指定一个指向另一个指针的指针。取消引用指定的指针将是类型不匹配。

变量名是放置内容的地方(内存地址的标签)。变量的类型是你可以放在那里的东西。在指针的情况下,你放入它的东西是一个内存地址。为了获得该地址,您可以取消引用指针。你可以在那个地址放置的那种东西与你在指针本身放置的东西不同。

  

在第一行之后,*testString是什么,testString是什么?

在第一行*testString之后testString的事情是垃圾(实际上是未定义的)。 testString是指向内存中地址的指针(4或8个字节,具体取决于您的系统),它也是未定义的。

在第二行之后,*testString是一个NSString对象。 testString仍然是指向地址的指针,其中有一个有效的NSString对象。