MRC手动
管理
ARC自动
管理内存
Automatic Reference(引用) Counting
Manual Reference(引用) Counting
oc采用"引用计数"(retain count)方式管理对象所占的内存
1.使用alloc为对象分配内存 //使 用dealloc释放对象所占用的内存
2.使用 alloc new 或者 copy 构造对象时,对象的retain count为1
3.调用对象的 retain 方法可以 增加 1 retain count
4调用对象的 release 方法可以 减少 1 retain count
5当对象的 retaincount为0 时候, .dealloc会自动调用,释放对象内存 ,否则 分配给对象的内存将一直被占用
6.所有对象可以使用 retaincount 属性查看当前计数器值
会影响计数器的操作
:
1.alloc创建一个对象没并将其引用计数设为1.并拥有对象的所有权
2.copy制造副本 并将副本的 引用计数设为1.并拥有副本的所有权
3, retain 使对象 引用计数加1 .并拥有对象的所有权
4. release 使对象 引用计数减1 .并放弃对象的所有权
5.autorelease 向autoreleasepool注册(>>?)
autorelease,该方法是将该对象内存的管理放到autoreleasepool中
属性声明中内存管理原则
@property(retain,nonatomic)
一个类中 如果 这个类有属性声明retain或者copy的属性 那么我们需要在这个类的 dealloc方法 里面去释放这个属性
@property(retain,nonatomic)Student*stu
dealloc方法(系统的方法)
dealloc方法在对象引用计数为0实 自动 调用
主要用于释 放自身所占用的资源 . 永远不要手动调用dealloc 应有系统自动调用
.m实现
-(void)dealloc
{
self.name=nil;//推荐这种.
//[_name release]//有野指针的情况发生
[super dealloc]
}
这是一个系统方法,系统会自动调用, 当一个对象的引用计数为1的时候 ,再调用release方法的时候,就会自动调用该方法,来释放对象)
内存释放原则一:
对象分配内存,并应在使用后,调用release释放内存
凡是出现retain alloc copy的地方 都要有release与之匹配
自动释放
autorelease pool
延迟释放(延迟到出了池才释放.而且池是最近的池(大括号))
一个大括号就是一个池
NSAutoreleasepool
自动释放池
当创建的对象未来某个时候销毁时 可以使用对象的autorelease
对象将所有权管理交给最近的NSAutoreleasePool对象,并由其全权管理
当池对象drain或release时 会逐一对池内对象发送release消息
+号方法一般使用
多用于有返回值的时候.
其他不建议使用
内存管理原则二:
内存无法确定释放时间时 可以使用autorelease像最近的池注册
由池决定释放所有权的时间
使用便利构造器获得的对象 都应是autorelease的
一定不要释放没有所有权的对象
assign.还有等号直接赋值的.
代码在硬盘中
堆 :alloc出来的对象//需要做内存管理,手动开辟手动回收
{
堆区(由程序员分配释放(动态分配内存的)): alloc 的内容(对象),实例变量(属于对象的一个部分所以跟对象一样放在堆区),动态属性 OC 特别 [NSString alloc]initWithFormat] 是创建格式化字符串在堆区
(与数据结构中的堆不同。但分配方式类似与链表
}
栈:局部变量.//不需要我们做内存管理.系统分配系统回收
{
栈区(由编译器自动分配释放):指针(对象的地址),局部变量,方法本身,静态属性
}
代码区: 类,方法(在被调用的时候才会占内存)
(存放函数体的二进制代码)
常量区 : 存放常量和字符串
OC 特别 [[NSString alloc]initWithString] 是创建字符串存在于常量区
静态区 ( 分为初始化区和未被初始化区):存放全局变量和静态变量
已被初始化的存放在初始化区,未被初始化的存放在未被初始化区
OC 中只需要管理堆里面的东西
程序的内存分配,分为:静态区,常量区,栈,堆,代码区
Manual Reference(引用) Counting
oc采用"引用计数"(retain count)方式管理对象所占的内存
1.使用alloc为对象分配内存 //使 用dealloc释放对象所占用的内存
2.使用 alloc new 或者 copy 构造对象时,对象的retain count为1
3.调用对象的 retain 方法可以 增加 1 retain count
4调用对象的 release 方法可以 减少 1 retain count
5当对象的 retaincount为0 时候, .dealloc会自动调用,释放对象内存 ,否则 分配给对象的内存将一直被占用
6.所有对象可以使用 retaincount 属性查看当前计数器值
会影响计数器的操作
:
1.alloc创建一个对象没并将其引用计数设为1.并拥有对象的所有权
2.copy制造副本 并将副本的 引用计数设为1.并拥有副本的所有权
3, retain 使对象 引用计数加1 .并拥有对象的所有权
4. release 使对象 引用计数减1 .并放弃对象的所有权
5.autorelease 向autoreleasepool注册(>>?)
autorelease,该方法是将该对象内存的管理放到autoreleasepool中
属性声明中内存管理原则
@property(retain,nonatomic)
一个类中 如果 这个类有属性声明retain或者copy的属性 那么我们需要在这个类的 dealloc方法 里面去释放这个属性
@property(retain,nonatomic)Student*stu
dealloc方法(系统的方法)
dealloc方法在对象引用计数为0实 自动 调用
主要用于释 放自身所占用的资源 . 永远不要手动调用dealloc 应有系统自动调用
.m实现
-(void)dealloc
{
self.name=nil;//推荐这种.
//[_name release]//有野指针的情况发生
[super dealloc]
}
这是一个系统方法,系统会自动调用, 当一个对象的引用计数为1的时候 ,再调用release方法的时候,就会自动调用该方法,来释放对象)
内存释放原则一:
对象分配内存,并应在使用后,调用release释放内存
凡是出现retain alloc copy的地方 都要有release与之匹配
自动释放
autorelease pool
延迟释放(延迟到出了池才释放.而且池是最近的池(大括号))
一个大括号就是一个池
NSAutoreleasepool
自动释放池
当创建的对象未来某个时候销毁时 可以使用对象的autorelease
对象将所有权管理交给最近的NSAutoreleasePool对象,并由其全权管理
当池对象drain或release时 会逐一对池内对象发送release消息
+号方法一般使用
多用于有返回值的时候.
其他不建议使用
内存管理原则二:
内存无法确定释放时间时 可以使用autorelease像最近的池注册
由池决定释放所有权的时间
使用便利构造器获得的对象 都应是autorelease的
一定不要释放没有所有权的对象
assign.还有等号直接赋值的.
@autoreleasepool { //一个对象刚刚被创造出来引用计数为1 Student*stu1=[[Student alloc]initWithName:@"zhangsan" andAge:22]; NSLog(@"stu1的引用计数为%ld",[stu1 retainCount]);
[stu1 retain];//retain引用计数加一相当于多了一条命
NSLog(@"stu1的引用计数为%ld",[stu1 retainCount]);
[stu1 release];//release引用减一相当于杀死一次
NSLog(@"stu1的引用计数为%ld",[stu1 retainCount]);
[stu1 release];//不可能为0的.(再写一次的话就是过度释放)
NSLog(@"stu1的引用计数为%ld",[stu1 retainCount]); }
代码在硬盘中
堆 :alloc出来的对象//需要做内存管理,手动开辟手动回收
{
堆区(由程序员分配释放(动态分配内存的)): alloc 的内容(对象),实例变量(属于对象的一个部分所以跟对象一样放在堆区),动态属性 OC 特别 [NSString alloc]initWithFormat] 是创建格式化字符串在堆区
(与数据结构中的堆不同。但分配方式类似与链表
}
栈:局部变量.//不需要我们做内存管理.系统分配系统回收
{
栈区(由编译器自动分配释放):指针(对象的地址),局部变量,方法本身,静态属性
}
代码区: 类,方法(在被调用的时候才会占内存)
(存放函数体的二进制代码)
常量区 : 存放常量和字符串
OC 特别 [[NSString alloc]initWithString] 是创建字符串存在于常量区
静态区 ( 分为初始化区和未被初始化区):存放全局变量和静态变量
已被初始化的存放在初始化区,未被初始化的存放在未被初始化区
OC 中只需要管理堆里面的东西
程序的内存分配,分为:静态区,常量区,栈,堆,代码区