繁体   English   中英

Objective-C和指针

[英]Objective-C and Pointers

我理解指针并知道它们是什么以及如何声明它们。 但问题是,书籍,教程或指南都没有解释为什么使用指针。

我来自PHP背景,其中不使用指针。 所以当我声明一个字符串时,我不使用指针。

我在创建方法时看到头文件中使用的指针,我真的不明白它们为什么存在。

任何帮助,将不胜感激。

局部变量具有自动持续时间 ,这意味着它们在函数退出时消失。 当局部变量直接绑定到值时,当函数退出时,值也必须不再存在。 PHP使用引用 (尽管“别名”在技术上是更好的匹配,对于PHP使用的)对于在创建它们的函数的调用之外必须存在的值,因此它们可以具有动态持续时间。 它还使用垃圾收集 (其实现在5.3中已更改)来管理这些值的生命周期。 您通常不必显式使用引用,因为(true)引用自动用于类类型,并且引用对于值类型不是必需的。

在PHP有引用的地方,Objective-C有指针,它来自C根。 指针允许您动态分配对象,以便它们在函数调用链(即堆栈)之外忍受。 您可以在Cocoa中进行垃圾收集 ,但这是一个较新的功能。 以前的技术基于引用计数 ,仍然非常可行(并且是iOS中的唯一选项和一些非Apple Objective-C实现)。

如果没有指针(或引用),对象将完全存在于堆栈中,并且在进入或离开函数时需要复制。 对象存储状态; 复制对象意味着当副本执行某些操作并更改其状态时,不会更新原始状态。 有时这不会是一个问题,而有时这将是一个致命的缺陷。 想象一下,如果I / O功能只能在副本上工作,输入或输出流会发生什么。

使用某些上下文添加到现有答案:Objective-C是C的严格超集。相当多的语言是约定而不是语法。 例如,使用'dealloc'来执行正式析构函数在其他语言中执行的操作只是从NSObject继承的类的约定。 编译器不会将您的dealloc方法识别为与其他方法截然不同。

允许将对象移植到C运行库的实用决策之一是它们总是存在于堆上,而不是堆栈上。 用于跟踪堆上的某些内容的C机制是一个指针。 因此,在Objective C中,您可以通过指针保持所有对象。 然后,自动释放池改善了语法负担,这会导致你真的想要像堆栈中的东西那样行事。

所以他们已经习惯了把事情放在堆里,正如已经回答的那样。 并且对象保留在堆上,因为内存管理依赖于约定,因为这样做允许将对象添加到C运行时并进行最小化更改。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM