Objective-C 基础知识之 (十七):内存管理原则二
2015-09-25 20:15
465 查看
内存管理
原则:
1、在一段代码内,对象的引用计数增加和减少要保证平衡。
2、凡是调用了retain、alloc、copy造成引用计数增加,当不再需要使用这个对象时,要调用release或autorelease相应的减少引用计数。
3、便利构造器方法内部要调用autorelease方法避免内存泄露。
4、使用便利构造器方法创建的对象,不需要调用release方法,否则会造成过度释放。
5、当对象的引用计数减为0时,对象会自动调用dealloc,不能手动调用。
6、在MRC下,实现dealloc方法时,最后一句代码[super dealloc]。
7、当对象的实例变量引用对象时,如果造成引用计数增加,需要在对象的dealloc方法中相应的减少引用计数。
8、集合对象会自动管理添加的对象。集合对象造成被添加对象的引用计数变化,不归我们处理。
9、谁造成引用计数增加,谁相应的减少引用计数。
10、对象类型的属性(除了delegate)都是用retain或copy修饰,如果使用assgin修饰会造成野指针(对象的实例变量是野指针)。
相关方法的内存实现:
- (void)setGender:(NSString*)gender
{
if (_gender != gender) {
[_gender release];
_gender = [gender retain];
}
}
-(void)setAddress:(NSString *)address
{
if (_address != address) {
[_address release];
_address = [address copy];
}
}
-(instancetype)initWithGender:(NSString *)gender
{
self = [super init];
if (self) {
_gender = gender;
}
return self;
}
+(instancetype)personWithGender:(NSString *)gender
{
Person * p = [[Person alloc]initWithGender:gender];
// 当管理这个对象的自动释放池销毁时,这个对象的引用计数减1.
// 自动释放池可能是系统创建的,可能是我们创建的。
return [p autorelease];
}
- (void)dealloc
{
// _gender、_address在指向外部传入的字符串对象时,都造成了对象的引用计数增加
[_gender release];
[_address release];
[super dealloc];
}
原则:
1、在一段代码内,对象的引用计数增加和减少要保证平衡。
2、凡是调用了retain、alloc、copy造成引用计数增加,当不再需要使用这个对象时,要调用release或autorelease相应的减少引用计数。
3、便利构造器方法内部要调用autorelease方法避免内存泄露。
4、使用便利构造器方法创建的对象,不需要调用release方法,否则会造成过度释放。
5、当对象的引用计数减为0时,对象会自动调用dealloc,不能手动调用。
6、在MRC下,实现dealloc方法时,最后一句代码[super dealloc]。
7、当对象的实例变量引用对象时,如果造成引用计数增加,需要在对象的dealloc方法中相应的减少引用计数。
8、集合对象会自动管理添加的对象。集合对象造成被添加对象的引用计数变化,不归我们处理。
9、谁造成引用计数增加,谁相应的减少引用计数。
10、对象类型的属性(除了delegate)都是用retain或copy修饰,如果使用assgin修饰会造成野指针(对象的实例变量是野指针)。
相关方法的内存实现:
- (void)setGender:(NSString*)gender
{
if (_gender != gender) {
[_gender release];
_gender = [gender retain];
}
}
-(void)setAddress:(NSString *)address
{
if (_address != address) {
[_address release];
_address = [address copy];
}
}
-(instancetype)initWithGender:(NSString *)gender
{
self = [super init];
if (self) {
_gender = gender;
}
return self;
}
+(instancetype)personWithGender:(NSString *)gender
{
Person * p = [[Person alloc]initWithGender:gender];
// 当管理这个对象的自动释放池销毁时,这个对象的引用计数减1.
// 自动释放池可能是系统创建的,可能是我们创建的。
return [p autorelease];
}
- (void)dealloc
{
// _gender、_address在指向外部传入的字符串对象时,都造成了对象的引用计数增加
[_gender release];
[_address release];
[super dealloc];
}
相关文章推荐
- Objective-C 基础知识之 (十六):内存管理原则一
- Objective-C 基础知识之 (十五):KVC
- Objective-C 基础知识之 (十四):属性 Property 点语法
- Objective-C 基础知识之(十三):类目、延展、协议、代理等的基本概念
- Objective-C 基础知识之(十二):NSDate
- Objective-C 基础知识之(十一):Block
- iOS经典讲解之Objective-C内存管理基础知识及内存管理黄金原则
- JDK源码阅读之Object类
- 《Objective-C入门 》 第一篇 - 合成存取器
- core foundation与objective-c之间有什么关系和区别
- Objective-C:为何使用ivar成员变量?Why would you use an ivar?[zz]
- Swift - AnyObject与Any的区别
- Swift调用Objective-C编写的代码(颜色选择器KKColorListPicker调用)
- Objective-C和JS交互
- C++ 11 - STL - 函数对象(Function Object) (中)
- Objective-C---3---NSString的常用方法
- 设计模式之工厂方法模式(代码用Objective-C展示)
- Java学习笔记【Object】
- 【投稿】打造Objective-C安全的Collection类型
- Object-C 对象初始化