堆和栈

作者: 世玉茹花 | 来源:发表于2017-08-15 15:50 被阅读16次

    

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

    相关文章

      网友评论

          本文标题:堆和栈

          本文链接:https://www.haomeiwen.com/subject/ejcvrxtx.html