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 中需要指针对象 的相关文章

  • 在 iPhone 上使用 Xcode Auto Layout 处理不同的图像尺寸

    通过纵向 iPhone 的自动布局 我不希望 iPhone 6 上的游戏角色的 UIImageView 尺寸与 iPhone 4S 中的完全相同 4S 的角色需要更小一些 否则看起来会太大 使用自动布局如何更改 iPhone 之间的图像尺寸
  • 清空 Firebase DatabaseReference 不会停止观察,这绝对正确吗?

    In the Firebase 太棒了 你做这个 var r1 DatabaseReference nil 然后这个 r1 Database database reference withPath score bucks r1 observ
  • AVPlayerLayer获取图像到UIImageView缓冲区

    我尝试 playerLayer renderInContext UIGraphicsGetCurrentContext 它将显示黑色背景 所以我得到当前播放器项目作为连续的重击图像 它看起来不像视频播放 只是静态图像连续流动 那么还有其他选
  • iOS App Today 扩展未上传到物理设备

    我正在为我的应用程序创建一个今日小部件http budgt ch http budgt ch因为一些用户要求快速访问关键功能 初步 扩展在 iOS 模拟器上运行良好 安装如下 1 安装最新的容器应用程序 2 安装以 今天 为容器的扩展 但是
  • 进入/退出编辑模式时重绘 UITableViewCell

    我有一个表格视图 其中根据表格是否正在编辑 单元格的构建方式有所不同 具体来说 处于编辑模式时选择样式为无 非编辑模式时选择样式为蓝色 当我从一个单元转换到另一个单元时 我注意到某些单元格没有更新 快速的日志记录告诉我 即使单元格的外观发生
  • 恢复从未付款过的用户的应用内购买

    我正在尝试在我的应用程序中测试应用程序内购买 当我与购买了应用程序内购买的测试用户恢复应用程序内购买时 一切正常 但是当我尝试与用户恢复应用内购买时didn t在我期望框架调用以下方法之前进行应用内购买 paymentQueue resto
  • CoreMediaIO,错误更新的属性 kCMIODevicePropertyDeviceIsRunningSomewhere

    当某些进程开始使用相机时 我需要接收一个事件 我通过 CMIOObjectGetPropertyData 完成此操作 但它不能正常工作 只有第一次访问时才是正确的值 我还尝试使用 CMIOObjectAddPropertyListenerB
  • PhoneGap/Cordova:如何使用cookies(iOS)?

    我有一个适用于 iOS 的 PhoneGap Corodova 项目 在 iOS 模拟器上构建时 我使用了 Jquery Cookies 它们很好 但是 既然我的设备上有该应用程序用于测试 它们就不再工作了 我猜这只是 iOS 不支持的东西
  • @Font-face 不适用于 IOS

    我正在开发一个 WordPress 网站 并且在每个页面上都有一个 H1 标签作为该页面的标题 我正在使用 font face 的特殊字体 它在每个浏览器的 Windows 上都运行良好 但是当我切换到 Mac 时 它不会显示 h1 标签
  • UIPickerView - 对多行行使用自定义视图 - 需要布局建议

    我有一个 UIPickerView 它将为用户显示项目列表 我希望每个项目都显示为多行文本 每行使用不同的字体大小 一个粗略的模型如下所示 这将允许显示比默认 UIPickerView 的单行所能容纳的更多文本 bdesham 指出我在 U
  • UIButton 图像未更改/更新

    首先 我对 Objective C 还很陌生 并且仍在尝试尽可能多地学习 所以请耐心等待 现在我有一个以编程方式创建的 UIButton 按下按钮时 将显示一个 UIActionSheet 其中包含 相机 选择照片 或 取消 选项 然后 按
  • 退出我的应用程序后未显示蓝色横幅“您的应用程序正在使用您的位置”

    我的应用程序在后台模式下使用核心位置 当应用程序处于后台模式并定期发送 GPS 坐标时 不会显示蓝色横幅 您的应用程序正在使用您的位置 例如谷歌地图应用程序 知道我可能错过了什么吗 要显示蓝色条 您应该 1 启用Background Loc
  • UISegmentedControl 中的自定义字体禁用调整FontSizeToFitWidth

    我已经为我的 UISegmentedControl 设置了自定义字体 但它似乎禁用了默认字体自动调整字体大小以适合宽度范围 Before After 这是我用来设置自定义字体的代码 UISegmentedControl segmentedC
  • 已执行最大重试次数。上传ipa问题

    我使用 build phonegap com 构建了 ipa 我试图将此 ipa 卸载到商店 但收到此错误 我解决了这个问题 安装xCode 4 并使用该xCode 4的版本应用程序加载器 这个问题得到解决
  • 将 UITableViewDataSource 与具有子视图的自定义单元格结合使用

    在 UITableView 中使用自定义单元格时 我遇到了奇怪的表格重叠 Problem 向下滚动 最后两行上面画有顶部两行 向上滚动 前两行上面画有下面两行 这是 UITableViewDataSource 的代码 func tableV
  • 创建类似于邮件应用程序菜单的 iPhone 弹出菜单

    当您想要回复消息时 我想创建一个类似于邮件应用程序中的弹出菜单 我在多个应用程序中看到过这一点 所以我不确定框架中是否内置了某些内容或一些示例代码 在 Swift 中创建操作表 代码已使用 Swift 5 进行测试 从 iOS 8 开始 U
  • Swift - 本地通知不会被触发

    我正在 Swift 3 中编码 我只是想发送通知now没有任何延迟或间隔 然而 通知永远不会被触发 这是我的代码 视图控制器代码 import UserNotifications class HomeViewController UIVie
  • 操作/Lambda 表达式内存管理问题

    我将一个操作存储在局部变量中 然后在该局部变量超出范围后使用 使用前是否有被清理的危险 这是一个例子 public List GetMaps Action
  • iOS 中如何清除特定域的 cookie?

    我已经搜索了 StackOverflow 上的几乎所有问题来寻找我的问题的答案 我还没有找到任何有用的链接或教程来说明哪种方式最好清除特定域的 cookie 如果有人可以帮助我 请 我自己找到了解决方案 如果您想删除 UIWebView 中
  • 如何在 iOS 中查找蓝牙音频设备

    好的 我正在开发一个有趣的项目 该项目有一个障碍 我需要为我的 iOS 应用程序启用蓝牙音频支持 我遇到的障碍是我什至无法开始获取已连接的蓝牙音频设备的列表 即使我的 iPhone 5S 可以识别我的耳机 大约 3 4 岁的耳机 LG HB

随机推荐

  • 当 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 中 我们使用的大多数对象都是通过用它们表示指针