OC学习

OC 内存的高级管理

2015-05-10  本文已影响151人  李小六_

属性的属性, 是对内存的优化,! 这里具体讲解

  1. 属性的内部实现原理

内存管理
NSString *houseOfMM = [[NSString alloc] initWithString:'装梵几的三室两厅'];

上面一段代码会执行以下两个动作:

  1. 在堆上分配一段内存用来存储@' 装梵几的三室两厅 ',比如:内存地址为0X1111 内容为' 装梵几的三室两厅'
  2. 在栈上分配一段内存用来存储 houseForWife ,比如:地址为 0XAAAA 内容自然为0X1111
    下面分别看下(assign,retain,copy):
  • assign的情况:
    NSString * myHouse = [ houseOfMM assign ];
    此时 myHousehouseOfMM 完全相同,地址都是 0XAAAA ,内容为 0X1111 ,即 myHouse 只是 houseOfMM 的别名,对任何一个操作就等于对另一个操作。因此 retainCount 不需要增加.(同进同出,关系好,一把钥匙,给我拿着)
  • retain的情况:
    NSString * myHouse = [ houseOfMM retain ];
    此时 myHouse 的地址不再为 0XAAAA ,可能为 0XAABB ,但是内容依然为 0X1111.因此 myHousehouseOfMM 都可以管理' 装梵几的三室两厅 '所在的内存。因此 retainCount 需要增加1.(有些独立,各自进出,两把钥匙)
  • copy的情况:
    NSString * myHouse = [ houseOfMM copy ];
    此时会在堆上重新开辟一段内存存放@'装梵几的三室两厅',比如0X1122,内容为@'装梵几的三室两厅',同时会在栈上为myHouse分配空间,比如地址:0XAACC,内容为0X1122,因此retainCount增加1供myHouse来管理0X1122这段内存.
    (两套@'装梵几的三室两厅',条件好,分居了,房子一人一套,所以钥匙一人一把。)
  • 什么时候用assign,当然是破房子,简装的房子拉
    基础类型(简单类型,原子类型):NSInteger,CGPoint,CGFloat,C数据类型(int,float,double,char等)
  • 什么时候用copy
    含有可深拷贝的mutable子类的类,如NSArray,NSSet,NSDictionary,NSData的,NSCharacterSet,NSIndexSet,NSString
    (可深度拷贝的房子)
    但是NSMutableArray这样的不可以,Mutable的不能用copy,不然初始化会有问题。切记
  • 什么时候用retain
    其他NSObject和其子类对象好嘛 (大多数)
    ARC中的strong相当于非ARC中的retain,ARC来了以后多搞一把钥匙就strong了啦。
  1. collection的内存管理
    collection 就是NSArray, NSDictionary, NSSet.....等容器类;
    collection 会自助管理自己内部的元素;
    加入collection中的对象会被retain;
    移除出collection的对象会被release;
    cellection被释放会对内部所有对象release;

  2. 多态;

    多态的特点;
    父类指针可以指向不同的子类对象;
    允许在多个类中定义同一个消息接口;
    可以屏蔽不同子类对象之间的差异, 写出通用代码;
    适应需求的不断变化;

上一篇 下一篇

猜你喜欢

热点阅读