A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© amoshaxiangp 中级黑马   /  2015-11-7 18:26  /  990 人查看  /  7 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

1.内存管理的范围:所有的OC对象(继承自NSObject类)
2.为什么内存管理只管理OC对象?程序运行时内存分为五大部分:从下往上:代码区,数据区,BSS段,以及堆区,栈区。其中前三个区域的数据,程序启动的时候占用内存区间,无法进行管理。栈区的数据由系统自动管理,不需要进行管理。栈区从高地址向低地址分配,堆区从低地址向高地址分配。堆区主要是OC中的实例对象,内存管理主要是对堆区进行管理,所以内存管理主要进行的OC对象的管理。
3.如何进行内存 管理?通过操作对象的引用计数器。
4.什么是引用计数器?  1)每个对象都有自己的引用计数器。2)它是一个整数(int,占用4个字节)。3)从字面上,可以理解为“对象被引用的次数”。4)也可以理解为:当前有多少个人正在使用这个对象。
5.引用计数器的作用?系统通过“引用计数器”来判断当前对象是否可以被释放。
6.对象的引用计数器的操作方式?   1)retain   使计数器+1  。2)release  使计数器-1。3)retainCount  返回当前计数器的值。当为0的时候无法使用,因为对象已被释放。
7.dealloc 方法。 1)当对象即将被销毁的时候,系统自动给对象发送一条dealloc消息,因此,从dealloc方法有没有被调用,可以判断出对象是否被释放。2)可以重写dealloc方法,并且在重写的最后,要调用父类的dealloc方法,也就是[super dealloc],注意:必须放在最后。3)dealloc方法无法被直接调用,只能系统自动调用。
8.野指针/空指针/僵尸对象。
  1)僵尸对象:已经被销毁的对象(不能再使用的对象)
  2)野指针:指向僵尸对象的指针。
  3)控制帧:没有指向内存空间的指针。存放的是nil,也就是0.
9.Xcode中有僵尸对象检测机制,开启之后,会防止程序对僵尸对象进行操作。
10.多对象的内存管理:
   -(void) setCar:(Car * ) car {
            _car=car;
}
-(void) drive{
          [_car Run];
          NSLog(@" %@在跑", _car.Name);
}
错误实例1):对象已经释放,再次去使用对象的方法。
[ car   release];  //此处释放了car 对象
[ p  drive];   //  此处p 未被释放,但是车已被释放,调用人的方法,造成了野指针car  访问僵尸对象 。
错误实例2):给p.car 设置不同对象造成原对象内存泄漏,原对象没有被释放。
错误实例3):给p.car设置同一对象,造成对象变为僵尸对象,以及本对象的指针成为了野指针。

正确的方法:在set 以及dealloc方法中管理对象的引用计数器:

-(void)  setCar:(Car *) car{
        if(_car!=car)
        {
               [ _car release];
               _car=[car  retain];  
        }
}
-(void) dealloc:{
            [ _car release ];
           [ super  dealloc ] ;
}

7 个回复

倒序浏览
笔记记得好细啊
回复 使用道具 举报

视频有只是回顾,然后根据视频重新整理了下而已 {:2_30:}
回复 使用道具 举报
笔记好细,要借鉴学习
回复 使用道具 举报
李凯666 发表于 2015-11-7 23:11
笔记好细,要借鉴学习

一起努力嘎嘎
回复 使用道具 举报
不错不错~~~~~~~~~~
回复 使用道具 举报
回头过来一看。以前的东西都忘了
回复 使用道具 举报
Dove丶凡 发表于 2015-11-8 18:53
回头过来一看。以前的东西都忘了

我也是,之前看过的基础的都忘了。。。所以看OC加强的时候特意弄了个笔记。。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马