zoukankan      html  css  js  c++  java
  • [Objective-C] 003_内存管理

    Objective-C内存管理,基本原理。

      1.为什么要进行内存管理?

      由于移动设备的内存极其有限,所以分配每个APP使用的内存也是有限制的,app运行时内存占用较多的话,系统就会发出内存警告,严重时会强制关闭app.

      本质原因是因为对象和其他数据类型在系统中的存储空间不一样,其它局部变量主要存放于栈内存中,而对象存储于堆内存中,当代码块结束时这个代码块中涉及的所有局部变量会被回收,指向对象的指针也被回收,此时对象已经没有指针指向,但依然存在于内存中,造成内存泄露。

      2.对象的基本结构

      每个Objective-C对象都有引用计数器(专门有4个字节的存储空间来存储),是一个整数表示对象被引用的次数,即现在有多少东西在使用这个对象。对象刚被创建时,默认计数器值为1,当计数器的值变为0时,则对象销毁。

      3.引用计数器的作用

      判断一个对象是否要被回收的依据就是看计数器的值是否为0,若为0则销毁

      4.引用计数器操作

      [object retain]:使object计数器+1

      [object release]:使object计数器-1

      [object retainCount]:获得object引用计数器值

       5.对象的销毁

      当object的引用计数器为0时,那么object将被销毁,object占用的内存被系统回收。当object被销毁时,系统会自动向object发送一条dealloc消息,一般会重写object的dealloc方法,在这里释放相关的资源,重写了dealloc方法就必须在代码块的最后调用[super dealloc],随后object存储空间被回收,记住不要手动向object 发送dealloc消息!

     

    Objective-C内存管理原则

      1.谁创建,谁release

      如果你通过alloc,new,copy来创建了一个对象,那么你就必须调用release或者autorelease方法。不是你创建的就不用你去负责。

      2.谁retain,谁release

      只要你调用了retain,无论这个对象时如何生成的,你都要调用release

      3.有始有终,有增有减,增减平衡

     

    Objective-C内存管理代码规范

      1.只要调用了alloc,new,copy,就必须有release(autorelease)

      2.重写dealloc方法一定要在最后调用[super dealloc];

     

    @property的参数相关

    @property (nonatomic, assign) int age;
    @property (nonatomic, retain) NSString *name;
    

    @property后的括号出现了四个特征性关键字:nonatomic , assign , retain , settet, 这些关键字直接告诉编译器后面的变量用何种方式来存取。

    属性关键字 使用范围 释义 是否是默认值 小贴士
    assign 赋值方式 不复制不保留,直接赋值 YES

    基本数据类型和本类不直接拥有的对象

    retain 赋值方式 将新值保留一份赋覆盖原值 NO 大部分对象可使用
    copy 赋值方式 将新值复制一份赋覆盖原值 NO 字符串选择性使用
    readwrite 读写权限 生成getter和setter两个方法 YES 变量可读取可修改
    readonly 读写权限 只生成getter方法 NO 变量只读不可修改
    atomic 原子性 原子操作 YES 可以保留在多线程环境下,能安全的存取值
    nonatomic 原子性 非原子操作 NO 不生成多线程同步内容
    getter 存取方法 自定义取方法 NO  
    setter 存取方法 自定义赋值方法 NO  
     

    关于nonatomic,如果我们能确定不需要多线程访问时,强烈推荐使用这个关键字,因为atomic对于性能的损失相对较大

     

    本站文章为 宝宝巴士 SD.Team 原创,转载务必在明显处注明:(作者官方网站: 宝宝巴士 
    转载自【宝宝巴士SuperDo团队】 原文链接: http://www.cnblogs.com/superdo/p/4542926.html

     

     

  • 相关阅读:
    数据结构01——线性表
    hdu 6069 Counting Divisors (唯一正整数分解定理+素数筛)
    hdu 6053 TrickGCD (莫比乌斯)
    hdu 1695 GCD(莫比乌斯入门)
    poj 2096 Collecting Bugs (概率dp)
    DC.p4: programming the forwarding plane of a data-center switch
    Packet Transactions: High-level Programming for Line-Rate Switches
    P4: Programming Protocol-Independent Packet Processors
    Improving Network Management with Software Defined Networking
    Are We Ready for SDN? Implementation Challenges for Software-Defined Networks
  • 原文地址:https://www.cnblogs.com/superdo/p/4542926.html
Copyright © 2011-2022 走看看