在这个片断:解释对象变量声明和赋值
NSString *testString;
testString = [[NSString alloc] init];
为什么,在第二行,我们不必写才能访问它实际上指向的地点*testString = ...
?
在第一行之后,什么是*testString
,什么是testString
?
在这个片断:解释对象变量声明和赋值
NSString *testString;
testString = [[NSString alloc] init];
为什么,在第二行,我们不必写才能访问它实际上指向的地点*testString = ...
?
在第一行之后,什么是*testString
,什么是testString
?
为什么在第二行,我们是不是必须编写
*testString = ...
才能访问它实际指向的位置?
的init
方法返回一个通用指针到对象 - 其返回类型是id
。 testString
是一个指向NSString
的指针,它是一个对象,因此您将指针指向另一个指针。取消引用指定的指针将是一种类型不匹配。
变量名称是放置内容的地方(内存地址的标签)。变量的类型是可以放在那里的东西。在指针的情况下,你放入它的那种东西也是也是的一个内存地址。为了得到这个地址,你需要解除指针的引用。你可以在这个地址放置的东西与你在指针本身放置的东西不同。
第一行之后,什么是
*testString
什么是testString
?
的第一行之后,*testString
,或的东西在该testString
点,是垃圾(实际上未定义)。 testString
是一个指针(取决于你的系统的4或8个字节)到内存中的地址,它也是未定义的。
第二行之后,*testString
是NSString
对象。 testString
仍然是指向地址的指针,其中存在有效的NSString
对象。
您正在创建NSString类型的指针的第一行。 C++和Objective-C中的指针在声明它们时用星号(*)字符表示。你说这个叫做“testString”的指针的第二行引用了你在内存中分配的NSString对象的内存位置。
所有对象都被指针引用。第一行
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指南。具体而言,本节
这只是因为我们影响指针。
[[NSString alloc] init]
返回指向NSString的指针。
在可可每一个对象是动态分配(如在用C malloc
)和每NSObject
被通它的指针/地址操纵(在这样一个点,很多程序员ObjC甚至不知道他们正在操纵指针和对象不)
谢谢乔希,感谢您编辑问题 –