我来自PHP / Javascript背景,在大多数情况下,事物直接存储在变量中,我们也有对象/类/方法等。这是OOP。
现在我开始学习Objective-C。我理解指针的基础知识。但现在一切都是指针。这是我没有得到的部分。为什么我们不喜欢直接分配的PHP / Javascript?我们毕竟还在做OOP。
由于
答案 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对象的所有内容的原因包括:
答案 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中,在堆上引用内存的唯一方法是通过指针。