Objective-C中的星号用法:相关问题

时间:2010-01-13 05:16:43

标签: objective-c cocoa objective-c-runtime

我有几个与此相关的问题:Asterisk usage in Objective-C

  

NSArray数组;在本地范围内,将是在堆栈上“分配”的对象。 NSArray *数组;表示由大量内存支持的对象,通常从堆中分配。

你怎么知道什么时候在堆栈和堆上分配了什么?堆栈上的所有局部变量都是堆上的指针吗?

  

因为您没有取消引用指向该对象的指针,并且指向该对象的指针在方法实现本身中至关重要。当你说...

4 个答案:

答案 0 :(得分:9)

  

你怎么知道什么时候在堆栈和堆上分配了什么?是否所有局部变量都在堆栈中......

没关系。堆栈和堆是实现细节; C和Objective-C语言不了解它们,你通常没有理由关心堆栈或堆上是否有东西。

在Mac OS X上,局部变量位于堆栈中。但是,对于几乎所有目的而言,这并不重要。别担心。

  

...并且都是堆上的指针?

没有。指针是内存地址;就是这样。

指针变量可以是任何其他变量的任何位置,也就是说,任何地方(根据您不必关心的实现定义的限制,如上所述)。

有关详细信息,请参阅my pointer tutorial

  
    

因为您没有取消引用指向该对象的指针,并且指向该对象的指针在方法实现本身中至关重要。当你说...

  
     

指针是内存地址。因此,它指的是该地址的内存。取消引用指针正在访问该内存。

你永远不会直接访问Cocoa对象占用的内存。您只发送消息,要么提出问题要么告诉它要做的事情。因此,您永远不会取消引用指针。

“......指向对象的指针在方法实现本身中是至关重要的。”意味着对象在其方法实现中将需要自己的指针。只能向指向对象的指针发送消息(这个细节通常被省略)。如果以某种方式将其关闭,则消息的接收者(即您发送消息的对象)将没有自己的指针。

假设可以向解除引用的对象发送消息。规范仍然是将消息发送到指向对象的指针,所以在很可能的情况下,对象仍然需要指向自身的指针 - 这使得对解除引用的对象发送消息的假设能力毫无用处。

因为它没用,所以他们完全抛弃了它。该对象将需要自己的指针(指针对于对象的方法实现至关重要),因此您只能 向其指针发送消息。

答案 1 :(得分:4)

*是C,C ++和Objective-C的解引用运算符。理解解除引用运算符和内存管理通常比Objective-C更广泛。这是任何C / C ++ / Objective-C开发人员的基本技能。看看网上的大量介绍C教程,了解更多信息。

编辑:关于c指针的任何教程都可以。例如http://home.netcom.com/~tjensen/ptr/pointers.htm

答案 2 :(得分:2)

在Cocoa中,你永远不会使用堆栈分配的对象;所有对象都将以*开头(请记住,类型“id”实际上是“指向某个对象的指针”的另一个单词)并在堆上创建。

你永远都会这样:

NSArray     *myArray;

从不这样:

NSArray     myArray;

您可以忽略第二个块,因为您总是取消引用指针。

答案 3 :(得分:2)

希望这些天真的玩具例子可以帮助你。

在C中,在函数中,

int x; // x is a variable of type int in stack
int *xp; // xp is a variable of type int * (pointer to int) in stack
int *xp2 = (int *) malloc(sizeof(int)); // xp2 is a variable in stack, it points to a memory location(size is of int) in heap
xp = &x; // xp can point to x
xp = xp2; // xp can also point to what xp2 points to
free(xp2); // now xp and xp2 point to a freed memory, BAD to use xp and xp2 now.
int **y; // y is a variable in stack, type is int **
y = (int **) malloc(sizeof(int *)); // allocate a piece of memory in heap, to hold a pointer to int(int *)
*y = (int *) malloc(sizeof(int)); // allocate a piece of memory in heap, to hold an int
**y = 100; // now we can use it
free(*y);
free(y);

在C ++中,在函数或成员函数(方法)中,

SomeClass a1; // a1 is an object of type SomeClass in stack
SomeClass *a2 = new SomeClass(); // a2 is a pointer(in stack) pointing to an object(of type SomeClass) located in heap
delete a2;

所以在C ++中,对象可以存在于堆栈或堆中

在Java中,在函数或方法中,

SomeClass b1; // b1 is just a reference, no object exists yet
b1 = new SomeClass(); // in java, objects can only exist in heap
int x; // however, primitive types are in stack, 

在Objective-C中,在函数或方法中,

SomeClass c1; // you can't do this.
SomeClass *c2 = [[SomeClass alloca] init]; // c1 is a pointer in stack, pointing to an object in heap
[c2 release];