按管理方式看: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框架会自动帮我们管理。
网友评论