为什么一切都是Objective-C中的指针

时间:2011-12-02 21:34:57

标签: objective-c oop

我来自PHP / Javascript背景,在大多数情况下,事物直接存储在变量中,我们也有对象/类/方法等。这是OOP。

现在我开始学习Objective-C。我理解指针的基础知识。但现在一切都是指针。这是我没有得到的部分。为什么我们不喜欢直接分配的PHP / Javascript?我们毕竟还在做OOP。

由于

6 个答案:

答案 0 :(得分:7)

如果你看看JavaScript和许多其他OO语言的语义(可能包括PHP,但我不确定并且不愿意猜测),你会看到这些语言通过指针提供了相同的间接性Objective C 。实际上,这些语言在内部使用指针。考虑这个(JavaScript)代码段:

function f(obj) {
    obj.x = 1; // modifies the object referred to directly
    obj = {x: 2}; // doesn't affect caller
}
var foo = {x: 0};
f(foo); // passes a pointer/"reference"
// foo.x === 1

它大致相当于(C,因为我不知道Objective C)这样的东西,模数手动内存管理,静态类型等等:

struct Obj { int x; };
void f(struct Obj *obj) {
    obj->x = 1;
    obj = ...; // you get the idea
}
struct Obj *foo = malloc(sizeof(*foo));
foo->x = 0;
f(foo);
free(foo);

它在Objective C中是明确的,因为该语言是C的超集(100%向后兼容性和互操作性),而其他语言已经废除了显式指针并使得它们需要隐含的间接。

答案 1 :(得分:2)

在PHP中,您也只使用指针但透明。 你真的使用对象的引用

答案 2 :(得分:2)

Objective-C的设计者决定使用指向Objective-C对象的所有内容的原因包括:

  1. 因此,他们可以处理幕后的内存管理,而无需让程序员自行完成这样做。
  2. 对象的快速枚举。
  3. (也许是最重要的)赋予能够传递nil(null)值而不会使程序崩溃的id类型的能力。

答案 3 :(得分:1)

在此基础上构建其他答案:在PHP和其他语言中,您仍在使用指针。这就是为什么passing by reference和传递价值之间仍有区别的原因。有几个很好的网站可以帮助explain the distinction,无论是语法还是通过任何一种方法传递的意义。


修改 请参阅我的帖子中的第二个链接。我对该信息的解释是PHP默认通过 value 。在函数调用期间在变量前面添加&符号会传递引用(或者更确切地说是变量的地址)。本质上,通过引用传递是传递指针,而传递值完全是值的副本。它们对它们的使用也有不同的含义(引用允许修改原始变量的值,甚至超出函数的范围等)。

答案 4 :(得分:1)

Objective C是ANSI C的严格超集和扩展,因此可以兼容地添加到语言中的本机类型受到限制(可能是通过原始实现)。但这种与ANSI C的兼容性已成为使用Objective C与重用跨平台C代码混合的优势之一。

BTW,OOP和“安全”几乎是正交概念。它们在消耗CPU周期和/或消耗用户电池电量方面各有不同的潜在成本。

答案 5 :(得分:0)

使用+alloc方法创建对象,该方法为堆上的新对象分配空间。在C中,因此在Objective-C中,在堆上引用内存的唯一方法是通过指针。