【发布时间】:2011-11-14 13:35:03
【问题描述】:
我对 NSString 指针有疑问。我想深入了解这一点,实际上试图创建一个理论,以基于从当时的网络检索到的多个信息来获得充分的理解。当我说我没有偷懒时,请相信我,我实际上阅读了很多,但我仍然有不确定性和疑问。您能否在好/错时确认/否认,并且我已经提出了(?)表示的其他问题和疑问。
我们开始: 如果我考虑这个非常基本的例子:
NSString *sPointer = [[NSString alloc]initWithString:@"This is a pointer"];
[sPointer release];
我的出发点是:编译器为指针类型保留 RAM 内存,并且该内存(也有自己的地址)包含存储另一个变量的内存地址(十六进制 - 二进制)(它指向的位置) )。实际的指针会占用大约 2 个字节:
1) 首先是一些一般性问题 - 不一定与目标 C 相关。关于 NSString 指针的实际问题将出现在第 2 点。 字符串是“字符串”,其中 1 个字符占用固定数量的内存空间,比如 2 个字节。 这自动意味着字符串变量占用的内存大小由字符串的长度定义。 然后我在维基百科上读到这个: “在现代字节可寻址计算机中,每个地址标识一个存储字节;数据太大而无法存储在单个字节中,可能驻留在多个字节中,占用一系列连续地址。” 所以在这种情况下,字符串值实际上包含在多个地址中,而不是由单个 1 包含(这已经与我在任何地方读到的不同)(?)。 这些多个地址在现实中是如何包含在 1 个指针中的?指针也会被分成多个地址吗? 您知道计算机中的哪些组件实际识别和分配实际地址“代码”吗?
现在是我的实际问题;
2) 在我的示例中,代码做了两件事:
- 它创建一个指向存储字符串变量地址的指针。
- 它实际上还保存了实际的“字符串变量”:@“这是一个指针”,否则将没有任何东西可以指向;
好的,我的问题;我想知道当你释放指针 [sPointer release] 时到底会发生什么;您实际上是在释放指针(包含地址),还是也在从内存中释放实际的“字符串变量”? 我了解到,当您删除引用时,存储实际变量的内存只会在编译器需要内存时被覆盖,因此当时不需要清除它。这是错的吗? 如果它是正确的,为什么他们说出于性能原因释放 NSString 指针真的很重要,如果你只是释放基本上只包含几个字节的指针?还是我错了,实际上存储实际变量的内存是否也通过“释放”消息立即清除?
最后还有:原始数据类型没有被释放,但它们在声明时“确实”占用了内存空间(但不超过一个公共指针)。事实上,我们为什么不应该释放它们呢?是什么阻止我们做类似的事情:int i = 5,然后是 [i release]?
很抱歉 - 1 次有很多问题!在实践中,我从来没有遇到过问题,但从理论上讲,我也很想完全理解它——我希望我不是唯一一个。我们可以讨论这个话题吗? 谢谢你,很抱歉打扰!
【问题讨论】:
标签: objective-c memory pointers nsstring theory