2011-11-01 36 views
0

在这个片断:解释对象变量声明和赋值

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

为什么,在第二行,我们不必写才能访问它实际上指向的地点*testString = ...

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

回答

1

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

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

变量名称是放置内容的地方(内存地址的标签)。变量的类型是可以放在那里的东西。在指针的情况下,你放入它的那种东西也是也是的一个内存地址。为了得到这个地址,你需要解除指针的引用。你可以在这个地址放置的东西与你在指针本身放置的东西不同。

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

的第一行之后,*testString,或的东西在该testString,是垃圾(实际上未定义)。 testString是一个指针(取决于你的系统的4或8个字节)到内存中的地址,它也是未定义的。

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

+0

谢谢乔希,感谢您编辑问题 –

2

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

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) 

我建议查看Apple的Objective-C指南。具体而言,本节

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

1

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

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

在可可每一个对象是动态分配(如在用C malloc)和每NSObject被通它的指针/地址操纵(在这样一个点,很多程序员ObjC甚至不知道他们正在操纵指针和对象不)