1.MRC
使用引用计数方式手动管理内存
release 引用计数减1
retain 引用计数加1
###手动内存管理黄金法则
谁调用new,alloc,retain,copy,multableCopy,谁就要调用对应的release或autorelease;
口诀:有加就有减
当你需要一个对象的时候,那么就给他发送一条retain的消息
当你不需要一个对象的时候,那么就给他发送一条release的消息
MRC中@property的使用
看例子
#import <Foundation/Foundation.h>
#import "CZRoom.h"
/*
手动内存管理的关键字
retain 就再setter 和 getter方法中加入一些内存管理的代码
当属性是一个普通OC对象的时候,使用retain
assign 直接赋值,不生成内存管理代码
当属性是一个基本数据类型的时候,使用assign
copy 复制对象,NSString 使用copy
线程安全
nonatomic:非原子,不会生成线程安全的代码,速度快,iOS通常都是这种
atomic:原子(默认),会生成线程安全的代码,速度慢
控制权限
readwrite:可读可写,生成getter 与 setter方法是声明与实现
readonly:只读 只生成getter方法
修改方法名称
getter 修改生成的getter方法的名称
一般情况下,BOOL类型的属性的getter方法是以is开头的
setter 修改生成的setter方法的名称
一般不去修改它
*/
@interface CZPerson : NSObject
@property (nonatomic,assign,getter=isMan) BOOL man;
@property (nonatomic,copy) NSString *name;
@property (nonatomic,assign,readonly) int age;
@property (nonatomic,retain) CZRoom * room;
循环引用
多个对象之间相互引用,形成环状。
解决方案:mrc的情况下将其中一方改成assign,不使用内存管理
2.自动释放池
O-C当中的内存释放,并不是像java/.net那样有一个自动的释放池,开发人员不用去关心有关内存释放的问题,O-C里面的自动释放池比c语言的手动内存管理要好一些,但是相对于java/.net来说又弱一些,所以说O-C当中的释放属于半自动的释放池。
什么是自动释放池
1、Autorelease pool
自动释放池(Autorelease pool)是OC的一种内存自动回收机制,可以将一些临时变量通过自动释放池来回收统一释放
2、autorelease
自动释放池本事销毁的时候,池子里面所有的对象都会做一次release操作
###自动释放池的原理:
1、系统中存在一个自动释放池栈, 当遇到 @autoreleasepool { 把这个自动释放池压入栈中
2、但遇到与之对应 } 自动释放池,出栈,它出栈的时候,会对池中所有对象进行一次release操作
3、自动释放池栈中,只有栈顶自动释放池是活动的,其他的都在休眠
4、当你调用autorelease的时候,它会把这个对象放在栈顶的自动释放池中
黄金法则:如果对一个对象使用了alloc,[mutable]copy,retain,那么必须使用相应的release或者autorelease.
参考文章:http://www.tuicool.com/articles/uiQfYf
autorelease:延长对象生命周期
把对象放到离自己最近那个自动释放池中
当自动释放池销毁的时候,它会把放在其中所有对象进行一次release的操作
它和对象在哪里创建没有关系
3.ARC
ARC automatic Reference Counting 自动引用计数
ARC 编译器特性
编译器会在适当时候,加入内存管理的代码
强指针:默认所有的指针都是强指针
只要是有强指针指向一个对象,那么这个对象就不会被释放
只要是没有强指针指向一个对象,那么这个对象就被立即回收
__strong 强指针标示,但是默认所有指针都是强指针,所以他没有用
弱指针:弱指针指向的对象不影响对象回收
注意:不要用弱指针指向一个刚刚创建出来的对象,否则刚刚建立就被回收
当出现循环引用的时候,必须要由一端是弱指针,否则互相引用无法释放内存,出错
弱指针的自动nil化
弱指针会在其指向的实例对象被释放后自动变成nil;
即当弱指针指向的实例对象被释放了,弱指针也不会变成野指针
类似c++的智能指针,arc还是要更好用一些的,缺点是只能管理oc alloc出来的内存,不能管理c语言的malloc出来的内存
ARC中@property的使用
见例子
#import <Foundation/Foundation.h>
#import "CZDog.h"
/*
内存管理
strong 对于普通对象
copy 字符串
assign 基本数据类型
weak 循环引用一端必须使用weak
*/
@interface CZPerson : NSObject
//年龄
@property (nonatomic,assign) int age;
//姓名
@property (nonatomic,copy) NSString * name;
//狗
@property (nonatomic,strong) CZDog * dog;
@end