在此片段中:
NSString *testString;
testString = [[NSString alloc] init];
为什么在第二行,我们不必编写*testString = ...
来访问它实际指向的位置?
在第一行之后,*testString
是什么,testString
是什么?
答案 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指南。特别是本节
答案 2 :(得分:1)
这只是因为我们影响指针。
[[NSString alloc] init]
返回指向NSString的指针。
在Cocoa中,每个对象都是动态分配的(如在C中的malloc
中),并且每个NSObject
都通过其指针/地址进行操作(在许多ObjC程序员甚至不知道的情况下)他们操纵指针而不是对象)
答案 3 :(得分:1)
为什么在第二行,我们不必编写
*testString = ...
来访问它实际指向的位置?
init
方法返回指向对象的通用指针 - 其返回类型为id
。 testString
是指向NSString
的指针,它是一个对象,因此您指定一个指向另一个指针的指针。取消引用指定的指针将是类型不匹配。
变量名是放置内容的地方(内存地址的标签)。变量的类型是你可以放在那里的东西。在指针的情况下,你放入它的东西是也一个内存地址。为了获得该地址,您可以取消引用指针。你可以在那个地址放置的那种东西与你在指针本身放置的东西不同。
在第一行之后,
*testString
是什么,testString
是什么?
在第一行*testString
或之后testString
点的事情是垃圾(实际上是未定义的)。 testString
是指向内存中地址的指针(4或8个字节,具体取决于您的系统),它也是未定义的。
在第二行之后,*testString
是一个NSString
对象。 testString
仍然是指向地址的指针,其中有一个有效的NSString
对象。