内存管理

 真机下 app 使用不能超过30M,否则系统会向app发送 Memory Warning消息,收到消息后 app必须正确处理,否则可能出错或者出现内存泄漏,甚至崩溃
        程序运行时的内存资源是有限的 Objective C语言所编写的程序中需要实例化对象
对象是要占用内存的 如果创建了对象(分配了内存)而不去释放这些对象所占用的内存,将会发生内存泄露
需要手机去管理内存
管理内存1.分配内存2.释放内存
在不需要这个对象的时候及时见这个对象释放掉,就可以防止内存泄露(光分配不释放)
不知道怎么去判断是否要释放一个对象 引用计数
引用计数:是判断一个对象是否存在的标准
引用计数公式:对象名.retainCount
什么样的数据需要手动管理内存
基本数据类型(不能称为对象,因为他只是一个单一的数据)不用手动管理内存 —系统会处理 —栈
除了基本数据类型 都需要手动管理内存(需要程序员管理)—堆
int a = 10;//栈 不需要管理内存
Person *p = [[Person alloc]init];//堆 需要管理内存 
程序员开辟的内存 属于分配到 堆里
系统自动分配的内存 回到栈里
内存管理的原则:谁分配 谁释放
retainCount 引用计数大于0的时候 就是对象存在的时候  如果不大于0就表示这个对象已经被释放了

生命周期
1.alloc 创建之后 对象就存在了
2.具体对象的操作
3.释放对象
生命周期:创建 操作 释放

引用计数
引用计数的操作:引用计数是判断一个对象 是否存在的标准(大于0)
让引用计数+1的方法:
1.alloc new
2.retain  保留引用计数
3.copy 拷贝
让引用计数-1的方法:
1.release 释放
2.autorelease 延迟释放
对象被释放的时候 会带调用一个销毁对象的方法   dealloc —销毁对象
有一个alloc retain copy就要有一个对应的release 才能释放掉对象
setter方法的内存管理
- (void)dealloc{
[super dealloc];
[原来的变量(全局变量)retain];
}

-(void)set对象名:(类名)参数名{
if(原来变量!=参数名){
  [原来变量 release];
原来的变量 = [参数名 retain];
   }
}

内存管理的原则:谁分配谁释放
有一个alloc retain copy就要有对应的release autorelease
dealloc—>销毁对象  只要调用了dealloc就标志着这个对象被销毁了
引用计数:对象名.retainCount
应用计数+1:alloc retain copy
引用计数-1:release autorelease

copy :会产生一个新的对象 新的对象引用计数+1
retain:保留 引用计数  给原来的引用计数+1 只要有一个引用计数为0 这个对象就会被销毁(操作的是同一个对象)
copy会产生一个新的对象给新的对象+1(跟原来的没关系)如果是释放了原来的对象新的对象依然存在
autorelease:延迟释放 等到需要释放的时候 才会释放 引用计数也会-1
autorelease常与自动释放池配合使用
自动释放池:在自动释放池里面的对象,只要使用了autorelease在出池的时候就会同意释放掉

自动释放池有两种写法
1.@autoreleasepool{
花括号内表示自动释放池内
} 出了花括号就表示出池(所有使用autorelease的对象全部会被释放掉)
2.NSAutoreleasePool *pool = [[NSAutoreleasePool alloc]init];
只要在自动释放池release之前都算池内
[pool release];所有使用autorelease的对象全部会被释放掉
属性的ARC关键字的声明
ARC:自动管理引用计数
属性手动管理引用计数
MRC:手动管理引用计数
RAC:1.string强壮的不会被释放调用(告诉系统这个属性是不能被释放的)
          2.unsafe_unretained允许在特殊情况下释放掉  不安全的

在定义字符串、数组、字典的时候一般使用copy
定义基本数据类型使用assign (assign:直接赋值)
其他对象都是用retain

属性其他关键字
1.只读:readonly 只允许只允许访问不允许修改(值允许使用getter的方法)
2.readwrite
3.getter = isSuccess 表示在赋值的时候这个属性叫做success在取值的时候叫做isSuccess

1.retain:只要使用属性除了基本数据类型 都可以使用retain
2.copy:在使用数组、字典、字符串作为属性的时候可以使用
copy 是为了防止赋值的数组被释放置空,影响属性的数组所以使用copy生成一个新的数组
3.assign 直接赋值只要是基本数据类型都可以用assign
设置属性的访问权限
readwrite:开放了属性的全部权限
readonly:只开放读取权限(保护对象里面的权限不被修改)

重写 优先调用子类重写的方法 如果子类还想实现父类同样方法的功能

dealloc 销毁对象
 - (void)dealloc{
具体销毁对象的内容
//当引用计数为0 是字懂调用者个方法
[super dealloc ];
}




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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值