真机下 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 ];
}