黑马程序员---学习笔记23:OC基础(10)内存管理

——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——-


内存分为几大区域:
1) 栈区:局部变量
2) 堆区:程序运行过程中动态分配的存储空间
3) BSS段:没有初始化的全局变量和静态变量
4) 数据区 :已经初始化的全局变量和静态变量,和字符串
5) 代码段:程序编译后代码的内容
后三个区域程序启动时,自动产生,因此我们的程序中不宜有过多的全局变量。
栈区内存分配是由高到低
堆区内存分配是由低到高


内存管理的范围:
管理任何继承自NSObject 的对象,对其他的基本数据类型无效。相应的区域是堆区。

内存泄漏:我们自己存储的内存空间,我们没有释放

对象在创建之后除了在堆区存在isa指针,实例变量,还存在retainCount计数器,用来存储有多少个该对象的拥有者

引用计数器是判断这个对象要不要回收的依据,如果为0就可以回收了
例外情况:对象值为nil时,计数器为0,但不会回收空间

对引用计数器的操作:
Retain消息:计数器+1,该方法返回对象本身
Release消息:计数器-1,(并不代表释放对象)
retainCount消息:获得对象当前的引用计数器值 %ld%tu

当对象引用计数器为0的时候,对象会被销毁,占用的内存会被系统回收。
系统向对象发送dealloc消息,一般需要重写。这是对象的临终遗言,在dealloc内部要调用[super dealloc]

OC中提供了三种内存管理方式:
1) MRC,手动管理
2) ARC,自动引用计数,IOS4.1之后推出的
3) Garbage collection(垃圾回收),ios不支持垃圾回收
学习需求:
理解MRC ,尽量使用ARC

手动内存管理:
注意:我们创建一个项目,此时默认的是ARC的(自动内存管理)
我们要手动改为MRC
找到项目---右侧Build settings----搜索auto---找到ARC,把后面的Yse改了

证明P的空间被释放,可以在Person类中重写dealloc方法,因为释放的话,会调用dealoc方法。

-(void)dealloc{
NSLog(@”Person挂掉了”);
[super dealloc];
}
Dealloc是系统根据计数器数值自动调用的,不要手动调用。
1) 如果有人使用,就不应该回收
如果你想使用这个方法,应该让这个对象retain一次
如果你不想使用这个方法,应该让这个对象release一次

2)谁创建,谁release
3)谁调用retain谁release
4)总结:有始有终,有加就该有减

内存管理研究的内容:
1) 野指针;定义的指针变量没有初始化 2)指向的空间已经被释放
2) 内存泄漏:指针没了,空间还在
Person *p =[Person new];
P存在栈区
[Person new]; 堆区
如果栈区的p已经释放了,而堆区的空间还没有释放,堆区的空间就被泄漏了


单个对象内存管理(野指针)
僵尸对象默认情况是不报错的,如果要让他报错要开启僵尸对象检测
顶部的target -edit scheme->run—Diag…--enable zombie object

nil :如果一个【对象】没有被赋值,默认的是nil
Nil: 给【类对象赋值】
NULL:通用指针,空指针
【NSNul null】:是一个对象,他用在不能使用nil 的场合

[nil run];没有任何效果,但是也不会报错。d = nil;可以给对象赋值
Nil 可以给类赋值
避免使用僵尸对象的方法,对象释放以后,给对象赋值nil,增加程序的健壮性

多个对象的野指针问题:
当有多个对象需要release 的时候,比如:人用车,在重写人release 的时候,在其中先release车,这样,不会造成人被释放,无法找到相应的车,造成车的内存释放。

对于对象作为另外一个类的实例变量
人有一条狗!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Dog * _dog;
-(void)setDog: (Dog *)dog{
1)判断对象是否是原对象
If(_dog!=dog)
{
2)release旧值
[_dog release];
Retain新值并且赋值给实例变量
_dog =[dog retain];
}



@property参数

三类 7个
原子性
Atomic:性能低,默认
nonatomic(效率高,速度快,一般使用这个)
读写
Readwrite:默认,setter和getter都声明和实现
Readonly:只是生成getter的声明和实现
内存管理
assign(直接赋值) 实例变量是基本数据类型的时候直接使用(默认,适用于非OC对象)

retain(对象判断,不过和赋值不相同,先release,然后retain一次,然后再赋值)什么时候使用retain,在一个类中关联其他对象的时候,这个对象的@property(nonautomic,retain)

copy :release旧值,copy新值

替换setter方法:@property(nonautomic,setter=isVip:)将系统默认的原setVip改为isVip
[p setVip:YES];->[p isVip:YES];

替换getter方法的名称:@property(nonautomic,setter=isVip:,getter=isVip)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值