当我们创建一个NSString *
变量,我们也不为此分配内存。
我们只在以下情况下分配内存alloc
被我们直接调用或者在我们调用的方法中调用。
An NSString
对象存在于我们分配的内存堆中,但是NSString *
变量(即指向NSString
object)存在于我们未分配的堆栈内存中。
例如,给定这两个变量:
NSString *stringOne;
NSString *stringTwo;
到目前为止,两者都没有在堆上分配任何内存,尽管它们确实以与char
, BOOL
, or int
存在于记忆中。
NSString *stringOne = [[NSString alloc] initWithString:@"Hello world"];
NSString *stringTwo = stringOne;
现在发生了什么?我们在堆上分配了一些内存NSString
目的。然后我们初始化这个内存来表示字符串“Hello world”,然后返回一个指向这个对象的指针并将其分配给stringOne
.
接下来,我们只需将该指针复制到我们正在使用的堆栈内存中stringTwo
。我们没有在堆上分配任何额外的内存。我们只是让两个字符串变量指向堆上相同的分配内存。
The 评论中链接的问答 jsd https://stackoverflow.com/questions/79923/what-and-where-are-the-stack-and-heap?lq=1有关堆栈和堆内存的更多解释将回答您的一些问题。
还值得注意的是,许多其他编程语言(例如 C++)允许在堆栈上创建对象,在这种情况下,我们不会像处理堆对象那样分配它们。它们确实存在于内存中,只是更类似于原始数据类型。