内存存储为HEAP或堆栈?

时间:2013-12-19 23:15:47

标签: objective-c stack-trace heap-memory

NSString *myString=@"MUKESH";
const NSString *myString1=@"MUKESH";
static NSString *myString2=@"MUKESH";
NSString *myString3=[NSString stringWithFormat:@"HELLO"];

NSString *myString4 =[NSString alloc] initWithString:@"HEllo"];

我的问题与内存堆和堆栈存储过程有关?
1-哪个字符串将像堆栈一样存储或哪个存储为堆?

谢谢

1 个答案:

答案 0 :(得分:3)

你只是没有选择在Obj-C中声明堆栈中的对象...但是那些并不是完全堆分配的......

代码中的

NSString *myString=@"MUKESH";

变量myString是指向NSString的指针...它在堆栈上分配,它指向的变量实际上不在堆上,而是在内存的特殊常量部分。

代码中的

NSString *myString4 =[NSString alloc] initWithString:@"HEllo"];

你可能期望myString4指向的值是堆分配的,但是因为在NSString的initWithString方法中有一个快捷方式,如果它所引用的字符串是一个常量字符串,它将只返回常量字符串...你可以通过以下方式验证:

NSString *myString4 =[[NSString alloc] initWithString:@"HEllo"];
if(myString4 == @"HEllo")
{
    NSLog(@"well that's weird");
}

但如果你做了类似

的事情
 NSString *myString5 =[[NSString alloc] initWithFormat:@"HEllo: %s", "Doc"];

然后myString5指向的值实际上是堆分配的......但实际上你不应该关注Objective-C中的那个