堆和栈



按管理方式看:oc对象存放于堆里面(堆内存需要程序员手动回收)

非oc对象一般放在栈里面(栈内存会被系统自动回收)

按分配方式分:堆是动态和回收内存的,没有静态分配的堆。

栈有静态分配和动态分配两种,静态分配由系统编译器完成,比如局部变量分配。动态分配是有alloc函数进行分配,它的动态分配也是由系统编译器进行释放,不需要程序员手动管理。


扩展:oc中nsstring的内存存储方式:

NSString* name = @"zhangsan"去定义,属于常量类型,程序会把这部分数据放到全局变量存储区,你不用释放,你也释放不掉,不信你可以release以后再查看它的retainCount;

[[NSString alloc] ] initWithFormat:@"%@ %@",firstname,secondname];这种类型的需要释放,因为alloc过了,程序需要手动用release释放,你写的那种方法不正确,没有直接init的。

[NSString stringWithFormat:@"%@ %@",firstname,secondname];这种类型生成的NSString是autorelease类型的变量,不需要释放,程序一次runLoop结束后就会释放。你不能用release释放。

初始化字符串的时候,直接赋值 @"abc",stringWithString ,alloc  initWithString这三种方法中,@"abc"  存放在常量池。重复赋值,不会重新分配内存空间。

注意:常量区的引用计数是lu的最大值。

stringWithFormat  alloc  initWithFormat ,存放的地址为堆区。    NSString 不需要我们进行内存管理,Foundation框架会自动帮我们管理。

你可能感兴趣的:(堆和栈)