gpt4 book ai didi

objective-c - NSString指针: theoretical questions after study

转载 作者:行者123 更新时间:2023-12-01 13:56:33 29 4
gpt4 key购买 nike

我对 NSString 指针有疑问。我想弄清楚这一点,并实际上尝试创建一个理论,以基于从当时网络检索到的多个信息来获得充分的理解。请相信我,我并没有偷懒,我实际上读了很多书,但仍然留下了不确定性和疑问。您能否确认/否认好/错,我已经提出了额外的问题和疑问,用(?)表示。

我们开始吧:如果我考虑这个非常基本的例子:

NSString *sPointer = [[NSString alloc]initWithString:@"This is a pointer"]; 
[sPointer release];

我的出发点是:编译器为指针类型保留 RAM 内存,并且该内存(也有自己的地址)包含存储另一个变量(它指向的位置)的内存地址(十六进制 - 二进制) )。实际的指针将占用大约 2 个字节:

1) 首先是一些一般性问题 - 不一定与 Objective C 有关。有关 NSString 指针的实际问题将在第 2 点中出现。字符串是“字符串”,其中 1 个字符占用固定量的内存空间,假设为 2 个字节。这自动意味着字符串变量占用的内存大小由字符串的长度定义。然后我在维基百科上读到了这个: “在现代字节寻址计算机中,每个地址标识存储的单个字节;太大而无法存储在单个字节中的数据可能驻留在占用一系列连续地址的多个字节中。” 所以在这种情况下,字符串值实际上由多个地址包含,而不是由单个 1 包含(这已经与我在各处读到的不同)(?)。1个指针中包含的多个地址实际上是如何实现的?指针也会被分成多个地址吗?您知道计算机中的哪个组件实际上识别并分配实际的地址“代码”吗?

现在是我的实际问题;

2)在我的示例中,代码做了两件事:

  • 它创建一个指向存储字符串变量的地址的指针。
  • 它实际上还保存了实际的“字符串变量”:@“这是一个指针”,因为否则就没有什么可以指向的;

好的,我的问题;我想知道当你释放指针时到底会发生什么[sPointer release];您实际上是释放指针(包含地址),还是也从内存中释放实际的“字符串变量”?我了解到,当您删除引用时,存储实际变量的内存将在编译器需要内存时被覆盖,因此当时不需要清除它。这是错误的吗?如果它是正确的,为什么他们说出于性能原因释放 NSString 指针非常重要,如果你只是释放基本上只包含几个字节的指针?或者我错了,存储实际变量的内存实际上也会通​​过“释放”消息立即清除吗?

最后还有:原始数据类型不会被释放,但它们在声明时“确实”占用了内存空间(但不超过公共(public)指针)。实际上我们为什么不应该释放它们呢?是什么阻止我们做这样的事情:int i = 5,然后是 [i release]?;

抱歉 - 一次问了很多问题!在实践中,我从来没有遇到过问题,但在理论上,我也真的很想完全理解它——而且我希望我不是唯一一个。我们可以讨论这个话题吗?谢谢您,抱歉打扰了!

最佳答案

也许我错了,但我昨天刚读到指针通常占用 4 个字节。这没有回答你的任何问题,但你似乎对此很感兴趣,所以我想我会提到它。

我认为您混淆的根源在于您将原语与 Objective-C 类混淆了。 Objective-C 类(或者准确地说是对象,类的实例)可以接受消息(类似于其他语言中的方法调用)。 retain 就是这样的消息之一。这就是为什么 Objective-C NSString 对象可以接收 retain 消息,但不能接收像整数这样的基元。我认为这是你的另一个困惑。 retainrelease 等不是 Objective-C 语言结构,它们是发送给对象的实际消息(认为是方法)。这就是为什么它们适用于 Objective-C 对象,但不适用于整数和 float 等基元。

另一个类似的困惑是,您所读到的有关字符串存储方式的内容更多地与 C 样式字符串有关,例如 char *name = "john"。但是,当您创建一个指向 NSString 的指针时,它指向一个 NSString 实例,它本身决定如何处理存储实际的字符串字节/人物。这可能与 C 字符串的存储方式相同,也可能不同。

data too large to be stored in a single byte may reside in multiple bytes occupying a sequence of consecutive addresses. " So in this case, the string value is actually contained by multiple addresses and not by a single 1 (this already differs from what I read everywhere) (?). How are these multiple addresses contained in 1 pointer in reality?

例如,在 C 语言中,指针将指向字符串中第一个字符的地址。

OK, my question; I wondered what really happens when you release the pointer [sPointer release]; are you actually releasing the pointer (containing the address), or are you also releasing the actual "string variable" from memory as well?

您正在向 NSString 实例/对象发送 release 消息。需要注意这一点,以避免进一步混淆。您不是对指针本身进行操作,而是对指针所指向的对象进行操作,即 NSString 对象。所以你没有释放指针本身。在向对象发送 release 方法后,如果其引用计数已达到 0,那么它将通过释放其存储的所有内容来处理自身释放,我想其中包括实际的字符串。

If it is correct, why do they say that it's really important to release the NSString pointer for performance reasons, if you just release the pointer which will basically contain only a few bytes?

所以,是的,您实际上是将 release 消息发送到字符串实例,并且会在必要时处理如何释放自身。如果您只是简单地删除指针,使其不再指向字符串实例,那么您将不再知道在哪里/如何访问存储在该位置的数据,但它不会使其神奇地消失,程序不会自动知道它可以使用该内存。你所暗示的是 garbage collection ,简单地说,未使用的内存将自动释放以供后续使用。 Objective-C 2.0 确实有垃圾回收功能,但据我所知,iOS 设备上还没有启用它。相反,新版本的 iOS 将支持一项名为 Automatic Reference Counting 的功能。其中编译器本身负责引用计数。

抱歉,如果我没有回答您的所有问题,您问了很多问题:P如果我的信息有误,请告诉我!我试图将我的答案限制在我认为我确实知道的范围内。

关于objective-c - NSString指针: theoretical questions after study,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7375156/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com