Objective C 中需要指针对象

2024-03-14

一个非常基本的问题..但理解这些概念确实非常重要.. 在 C++ 或 C 语言中,我们通常不使用指针变量来存储值。即值简单地存储为:

int a=10;

但在 ios sdk 中,在 Objective C 中,我们使用的大多数对象都是通过用它们表示指针来初始化的,如下所示:

NSArray *myArray=[NSArray array];

所以,我脑子里出现了一个问题,那就是,什么是benefit and need使用指针对象(这就是我们在这里所说的,如果不正确,请告诉).. 另外,当使用指针对象进行分配时,我有时会对内存分配基础知识感到困惑。我可以在任何地方寻找好的解释吗?


在c++或c语言中,我们通常不使用指针变量来存储值

我会把“或C”部分去掉。 C++程序员do不赞成使用原始指针,但 C 程序员却不这么认为。 C 程序员喜欢指针,并将其视为解决所有问题的必然灵丹妙药。 (不,不是真的,但是指针仍然是非常频繁地在C中使用。)

但在ios sdk中,在objective c中,我们使用的大多数对象都是通过用它们表示指针来初始化的

哦,仔细看看:

大多数物体

更接近:

objects

所以你在谈论 Objective-C 对象,amirite? (忽略 C 标准本质上描述的微妙之处all值和变量作为“对象”。)

实际上,Objective-C 对象始终是 Objective-C 中的指针。由于 Objective-C 是 C 的严格超集,因此在编写 iOS 应用程序(或 OS X 应用程序,或任何其他基于 Objective-C 的程序)时,所有 C 习惯用法和编程技术仍然适用。它是无意义、多余、浪费,因此甚至被认为是错误写一些类似的东西

int *i = malloc(sizeof(int));
for (*i = 0; *i < 10; ++*i)

只是因为我们身处 Objective-C 的土地。基元(或更准确地说,C++ 术语中的“普通旧数据类型”)仍然遵循“如果不需要,请勿使用指针”规则。

使用指针对象的好处和需要是什么

那么,为什么它们是必要的:

Objective-C 是一种面向对象的动态语言。该语言的这两个密切相关的属性使程序员可以利用以下技术:多态性 http://en.wikipedia.org/wiki/Polymorphism_(computer_science), 鸭子打字 http://en.wikipedia.org/wiki/Duck_typing and 动态绑定 http://en.wikipedia.org/wiki/Late_binding(是的,这些是超链接,单击它们)。

这些功能的实现方式使得所有对象都必须由指向它们的指针来表示。让我们看一个例子。

编写移动应用程序时的一个常见任务是从服务器检索一些数据。现代基于 Web 的 API 使用 JSON 数据交换格式来序列化数据。这是一种可以解析的简单文本格式(例如,使用NSJSONSerializationclass)转换为各种类型的数据结构及其对应的集合类,例如NSArray or an NSDictionary。这意味着 JSON 解析器类/方法/函数必须返回一些东西generic,可以代表的东西both一个数组和一个字典。

那么现在怎么办?我们无法返回非指针NSArray or NSDictionarystruct(Objective-C 对象实际上只是我知道 Objective-C 工作的所有平台上的普通旧 C 结构),因为它们具有不同的大小,它们具有不同的内存布局等。编译器无法理解的代码。这就是为什么我们返回一个指向通用 Objective-C 对象的指针,类型的id.

C 标准强制要求指向structs(以及对象)具有相同的表示和对齐要求(C99 6.2.5.27),i。 e.指向任何结构的指针都可以安全地转换为指向任何其他结构的指针。因此,这种方法是正确的,我们现在可以返回任何对象。使用运行时自省,还可以动态确定对象的确切类型(类),然后相应地使用它。

以及为什么它们更方便或更好(在某些方面)比非指针:

使用指针,无需传递同一对象的多个副本。创建大量副本(例如,每次将对象分配给或传递给函数时)可能会很慢并导致性能问题 - 一个中等复杂的对象,例如视图或视图控制器,可以有数十个副本。实例变量,因此单个实​​例实际上可以测量数百个字节。如果一个采用对象类型的函数调用在一个紧密的循环中被调用数千或数百万次,那么重新分配和复制它是相当痛苦的(无论如何对于CPU来说),并且只传递一个更容易和更直接的方法指向对象的指针(该对象的大小较小,因此复制速度更快)。此外,Objective-C 作为一种引用计数语言,甚至“不鼓励”过度复制。保留和释放优于显式复制和释放。

另外,当使用指针对象进行分配时,我有时会对内存分配基础知识感到困惑

那么你很可能已经很困惑了without指针。不要将其归咎于指针,这只是程序员的错误;-)

所以这里...

  • ...Apple 的官方文档和内存管理指南 https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/MemoryMgmt/Articles/MemoryMgmt.html;
  • ...我能找到的最早相关的 Stack Overflow 问题 https://stackoverflow.com/questions/710288/where-are-the-best-explanations-of-memory-management-for-iphone;
  • ...在尝试继续 Objective-C 编程 #1 之前你应该阅读的内容 http://c-faq.com/malloc/index.html; (即先学习C)
  • ...在尝试继续 Objective-C 编程之前应该阅读的内容 #2 http://c-faq.com/ptrs/index.html;
  • ...在尝试继续 Objective-C 编程之前应该阅读的内容 #3 http://c-faq.com/aryptr/index.html;
  • ...以及一个关于 C 内存管理规则、技术和习惯用法的旧 Stack Overflow 问题 https://stackoverflow.com/questions/24891/c-memory-management;

玩得开心! :-)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Objective C 中需要指针对象 的相关文章

随机推荐

  • 当 PUT 请求中包含响应时,Ember Data 会重新加载关联

    我有以下简单的亲子关系 App Parent DS Model extend children DS hasMany child App Child DS Model extend parent DS belongsTo parent 我遇
  • 使用扫描仪读取文件但将空白行跳过到二维数组中

    我正在努力使用扫描仪类来读取文本文件 同时跳过空白行 有什么建议么 Scanner sc new Scanner new BufferedReader new FileReader training2 txt trainingData ne
  • 为什么存储过程返回-1

    我对存储过程非常陌生 我没有更多的想法了 我正在尝试使用存储过程将数据插入数据库 如果存在则返回0 否则插入数据并返回1 这样我就可以在标签上打印已插入数据或数据已存在的文本 每次输入都会返回 1 这是我的存储过程 是不是不对 USE HR
  • 当我的计算机上有 Python 2、Python 3 和 Anaconda 时,如何控制将包安装到哪个 Python 发行版?

    我的 Windows 计算机上安装了以下 Python 发行版 Python 2 7 空闲 Python 3 4 空闲 蟒蛇 Python 3 4 显然 他们都将库存储在不同的位置 那么 每次需要时 如何轻松地对其中一个 不同的 进行有针对
  • 在现代浏览器中,JavaScript 书签是否有任何安全限制?

    我读了一篇article https blog lastpass com 2014 07 a note from lastpass html 关于小书签 它说小书签非常强大 它们可能很危险 例如 恶意书签可以收集你的 cookies loc
  • Visual Studio 2013 Ultimate 中 CA1502 的自定义阈值

    这个问题 CA1502 的自定义阈值 https stackoverflow com questions 21678642 custom threshold for ca1502讨论如何在代码分析中为代码指标规则设置自定义阈值 我有同样的问
  • 插入到服务中的房间而不更新活动中的 LiveData

    我正在使用 room 将前台位置服务获取的数据与活动进行通信 该服务连接到视图模型并插入数据 但是该活动不会从视图模型接收更新的 LiveData 但是它能够在开始时获取 LiveData gt 对象 并在重新启动应用程序时获取准确的大小
  • 如何将滑动速度和位置转换为对象速度

    我正在开发一款 踢球门 类型的游戏 目的是自学 Unity 3d 我有我想要的界面和功能 游戏看起来像这样 我在 OnUpdate 中使用一些代码来检测鼠标按钮何时首次按下 或触摸阶段开始 以及何时释放 或触摸阶段结束 并计算滑动方向 距离
  • 如何在React-router中手动调用Link?

    我有一个通过 props 接收的组件对象来自反应路由器 每当用户单击此组件内的 下一步 按钮时 我想调用手动对象 现在 我正在使用refs访问支持实例并手动单击 a 标签生成 问题 有没有办法手动调用链接 例如this props next
  • PHP 会话在curl 调用后未保存

    我需要通过curl脚本验证我的用户 session start POST username user POST password password ch curl init url signin php curl setopt ch CUR
  • 通过 .htaccess 从 URL 中删除参数

    我需要建议如何使用从 url 中删除参数 访问 条件如下 重定向网址来自 http example com movie 2 ref nf to http example com movie 2 我尝试了几种选择 但没有得到任何结果 感谢您的
  • sqlalchemy并发更新问题

    我有一张桌子 jobs 有字段id rank和日期时间started在 MySQL InnoDB 数据库中 每次进程获得作业时 它都会 检查 该作业并将其标记为已启动 以便其他进程不会对其进行处理 我希望一个带有会话的进程能够 找到排名最高
  • Netty连接限制

    我正在开发一个使用 netty 3 6 5 的应用程序服务器 我想先了解一下期权积压的完整含义 另外 为什么没有关于 serverbootstrap 选项的文档来帮助我们开发人员 我的另一个问题是如何最好地限制服务器的并发连接数以获得更好的
  • 实例和静态函数的重新声明

    class me private name public function construct name this gt name name public function work return You are working as th
  • SQL 列引用“id”不明确

    我尝试了以下选择 SELECT id name FROM v groups vg inner join people2v groups p2vg on vg id p2vg v group id where p2vg people id 0
  • 如何在 Haskell 中对列表进行分区?

    我想获取一个列表 或字符串 并将其拆分为 N 个元素的子列表 我该如何在 Haskell 中做到这一点 Example mysteryFunction 2 abcdefgh ab cd ef gh cabal update cabal in
  • 在 jquery 中启用/禁用下拉框

    我是 jQuery 新手 我想使用复选框启用和禁用下拉列表 这是我的html
  • 从 ruby​​-ncurses 中获取 256 种颜色

    我的终端有 256 种颜色 效果很好 测试脚本在这里 http www frexx de xterm 256 notes 但是当我使用 ncurses 通过 Ruby ncurses 时它停止工作 打印该页面上给出的转义序列工作正常 但是当
  • 这句话有什么道理呢? (Sun 对 Java 变量的命名约定)

    这几天我一直在引用Sun的文档中的这段话 直到现在我才停下来思考它在说什么 但我却无法理解它的意义 请记住 英语不是我的母语 命名约定 http java sun com docs codeconv html CodeConventions
  • Objective C 中需要指针对象

    一个非常基本的问题 但理解这些概念确实非常重要 在 C 或 C 语言中 我们通常不使用指针变量来存储值 即值简单地存储为 int a 10 但在 ios sdk 中 在 Objective C 中 我们使用的大多数对象都是通过用它们表示指针