- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我对 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
消息,但不能接收像整数这样的基元。我认为这是你的另一个困惑。 retain
和 release
等不是 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/
小弟便兴起了学一学re的想法,但小弟天生就比较懒一些,总希望看有没有些快速学习的方式,于是小弟又请出google大神,藉由祂的神 力,小弟在网络上找到了jim hollenhorst先生的文章,经过
我正在研究FastMM的代码,它在运行时更改方法和函数的地址。但有些事情我不明白。 http://koders.com/delphi/fid356C72C9C454FA74A916971690F624
我们遇到了一个问题,我将其简化为以下内容:给你一个全为 1 的二进制数(例如 11111)和一组相同长度的二进制数(00101、10000、01100、00100、11100)。有两个玩家 A 和 B
我创建了从文本文件中读取并删除特殊字符的程序。我似乎无法更好地编写 if 语句。请帮忙。我在网上搜索了正确的代码语句,但它们都有高级代码语句。我正在学习的书的最后一章(第 14 章)包含字符串和文件打
我的程序获得了以下代码的帮助。我正在工作,谢谢'paxdiablo'。结果中仍然显示“\”字符。我该如何解决? (不确定如何回复“paxdiablo”给 sya 谢谢。 if (strchr (",.
我对 NSString 指针有疑问。我想弄清楚这一点,并实际上尝试创建一个理论,以基于从当时网络检索到的多个信息来获得充分的理解。请相信我,我并没有偷懒,我实际上读了很多书,但仍然留下了不确定性和疑问
由于我发现时效性和语义准确性之间存在相关性(我正在研究关联数据质量维度评估,试图从另一个维度(语义准确性)评估维度质量-在本例中为时效性),我假定回归分析是这件事的下一步,我使用了IBM SPSS统计
我是纽约市的一名研究人员,正在寻求有关netmeta功能的帮助(我使用v2.1-0是为了与这里列出的指南兼容)。。当我使用以下参数在我的数据集上运行函数netmeta时(com.Fixed=False
我想知道是否有人知道如何或是否有可能仅使用 CSS、HTML5 和 Javascript 跟踪鼠标光标移动、按钮点击和点击时间到异地数据库?我问这个关于可用性研究的问题。 最佳答案 Javascrip
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
//DeMark_9_Indicator_Wealth_Insider study("DeMark9 Indicator",overlay=true) TD = close > close[4] ?n
我对 SOAP vs REST 问题给出的答案不满意,尤其是这里: Performance of SOAP vs. XML-RPC or REST 因为它只是一般的哲学答案,而不是一些研究案例的实用答
我想创建一个简单的 JavaScript 程序来帮助我学习,但我很难弄清楚如何设计它。我对 JS 还很陌生,这实际上是我第一个不是从书本上复制的应用程序。 示例场景:我有多个国家/地区,并且在每个国家
来自 Perl 的 documentation : study takes extra time to study SCALAR ($_ if unspecified) in anticipation
锁定。这个问题及其答案是locked因为这个问题是题外话,但具有历史意义。它目前不接受新的答案或交互。 排除与基准测试和基准比较相关的所有明显警告,是否有任何研究(一系列有据可查且无偏见的测试)比较了
硬件:我们使用 24 核(2*12 核)机器。 SSD 磁盘和 SAS-RAID 0 磁盘有 2 个独立的 Controller 。操作系统:Windows 8.1。超线程已禁用。 软件: 2.1。有
有人能告诉我这段代码有什么问题吗?它会引发以下错误并导致应用程序崩溃: reason: 'keypath Studies.patients.PatientName not found in entit
我想学习 php 和 mySQL,我买了一本书(php 和 mySql:缺失的手册第 2 版) 我在win8 64位机器上安装了Wampserver2.4。 服务器配置 Apache 版本:2.4.4
我是一名优秀的程序员,十分优秀!