IOS内存管理示例代码
2014-03-08 12:44
323 查看
内存管理的是—> 堆内存部分
内存—> 堆、栈、全局《包含常量区》、系统自带
内存管理原则:
1.凡是alloc 、retain、copy的地方,都应出现release 或是 autorelease与之对应;
2.属性为retain 或 copy 时,需要在类的dealloc 中释放此属性;
3.便利构造器本身包含autorelease;
4.一定不要释放没有所有权的对象,不要手动调用dealloc;
OC -----内存管理
OC 的两大机制:
1、消息传递机制<方法调用>
2、引用计数;
属性的作用
1.声明实例变量
2.setter和Getter方法 及实现
copy —>针对的是特殊的对象类型
必须遵守了NSCopying协议的对象
关键字 retainCount 描述
alloc 1 创建对象——>拥有对象所有权
init 1 初始化
dosomething 1 执行方法
retain 2 增加 1 ——> 拥有对象所有权
release 1 减去1 ——-> 放弃对象的所有权
dealloc 0 销毁对象
//初始化方法
-(id)initWithName:(NSString *)name
age:(int)age{
self =[super init];
if (self)
{
self.name =
name;
self.age =
age;
}
return self;
}
//便利构造器
+(id)personWithName:(NSString *)name
age:(int)age{
Person *per = [[Person alloc] initWithName:name age:age];
return per;
}
//Person 类的实例对象生命周期结束的标志就是 系统调用dealloc 方法销毁内存
//重写 系统dealloc
-->析构函数方法
-(void)dealloc{
//输出执行方法的方法名和所在行数
NSLog(@"打印方法名:%s",__FUNCTION__,__LINE__);
[_name release];//当前person 类的对象所拥有的_name实例对象需要被释放所有权,以便_name对象通过系统自动调用其本身的dealloc销毁内存
[super dealloc];
}
Person *person = [Person personWithName:@"lily" age:23];
NSLog(@"person的引用计数为:%lu",[person
retainCount]);//打印引用计数
[person retain];//应用计数 +1
NSLog(@"person的引用计数为:%lu",[person
retainCount]);//打印引用计数
[person release];//释放
NSLog(@"person的引用计数为:%lu",[person
retainCount]);//打印引用计数
[person release];//释放
NSLog(@"person的引用计数为:%lu",[person
retainCount]);//打印引用计数
Car * papaCar = [[Car alloc] init];
Car * mamaCar = [papaCar retain];//retainCount+1
Car * sonCar = [mamaCar retain];//retainCount+1
Car *friendCar = sonCar;//直接指向
//结果都一样
//由于 papaCar-->alloc
int 时 为1,mamaCar
+1 , sonCar+1 最终操作的都是同一个对象,只是指针不同但指向相同
NSLog(@"papaCar = %lu ",[papaCar retainCount]);
NSLog(@"mamaCar = %lu ",[mamaCar retainCount]);
NSLog(@"sonCar = %lu ",[sonCar retainCount]);
NSLog(@"friendCar = %lu ",[friendCar retainCount]);
[sonCar release];
NSLog(@"friendCar = %lu ",[friendCar retainCount]);
[mamaCar release];
NSLog(@"sonCar = %lu ",[sonCar retainCount]);
[papaCar release];
NSLog(@"papaCar = %lu ",[papaCar retainCount]);
@interface Room : NSObject
/*
Room类有一个Person类型的属性:person
*/
//@property (nonatomic,assign)Person *person;
@property (nonatomic,retain)Person *person;
//-(void)setPerson:(Person *)person{
// _person = person;
//}
//重写dealloc方法
-(void)dealloc{
NSLog(@"打印room中的dealloc%s",__FUNCTION__,__LINE__);
[_person release];//重写了原有方法中没有的内容
[super dealloc];
}
// 对房间的相关操作
Person *newperson = [Person personWithName:@"lily" age:23];//1
Room * rooms = [[Room alloc] init];//1
rooms.person =newperson;//2
[newperson release];//1
[rooms release];//0-->调用自身dealloc方法销毁自身内存
//但是由于我们重写了dealloc方法,所以在销毁自身内存之前,会对Person类型对象通过_person指针发送release消息,让之前的retainCount为1的Person 类型对象retainCount减为0,系统会调用Person类自己的dealloc,来销毁Person类型对象所占有的内存空间
NSLog(@"who is in the room?\n%@",rooms.person);
内存—> 堆、栈、全局《包含常量区》、系统自带
内存管理原则:
1.凡是alloc 、retain、copy的地方,都应出现release 或是 autorelease与之对应;
2.属性为retain 或 copy 时,需要在类的dealloc 中释放此属性;
3.便利构造器本身包含autorelease;
4.一定不要释放没有所有权的对象,不要手动调用dealloc;
OC -----内存管理
OC 的两大机制:
1、消息传递机制<方法调用>
2、引用计数;
属性的作用
1.声明实例变量
2.setter和Getter方法 及实现
copy —>针对的是特殊的对象类型
必须遵守了NSCopying协议的对象
关键字 retainCount 描述
alloc 1 创建对象——>拥有对象所有权
init 1 初始化
dosomething 1 执行方法
retain 2 增加 1 ——> 拥有对象所有权
release 1 减去1 ——-> 放弃对象的所有权
dealloc 0 销毁对象
//初始化方法
-(id)initWithName:(NSString *)name
age:(int)age{
self =[super init];
if (self)
{
self.name =
name;
self.age =
age;
}
return self;
}
//便利构造器
+(id)personWithName:(NSString *)name
age:(int)age{
Person *per = [[Person alloc] initWithName:name age:age];
return per;
}
//Person 类的实例对象生命周期结束的标志就是 系统调用dealloc 方法销毁内存
//重写 系统dealloc
-->析构函数方法
-(void)dealloc{
//输出执行方法的方法名和所在行数
NSLog(@"打印方法名:%s",__FUNCTION__,__LINE__);
[_name release];//当前person 类的对象所拥有的_name实例对象需要被释放所有权,以便_name对象通过系统自动调用其本身的dealloc销毁内存
[super dealloc];
}
Person *person = [Person personWithName:@"lily" age:23];
NSLog(@"person的引用计数为:%lu",[person
retainCount]);//打印引用计数
[person retain];//应用计数 +1
NSLog(@"person的引用计数为:%lu",[person
retainCount]);//打印引用计数
[person release];//释放
NSLog(@"person的引用计数为:%lu",[person
retainCount]);//打印引用计数
[person release];//释放
NSLog(@"person的引用计数为:%lu",[person
retainCount]);//打印引用计数
Car * papaCar = [[Car alloc] init];
Car * mamaCar = [papaCar retain];//retainCount+1
Car * sonCar = [mamaCar retain];//retainCount+1
Car *friendCar = sonCar;//直接指向
//结果都一样
//由于 papaCar-->alloc
int 时 为1,mamaCar
+1 , sonCar+1 最终操作的都是同一个对象,只是指针不同但指向相同
NSLog(@"papaCar = %lu ",[papaCar retainCount]);
NSLog(@"mamaCar = %lu ",[mamaCar retainCount]);
NSLog(@"sonCar = %lu ",[sonCar retainCount]);
NSLog(@"friendCar = %lu ",[friendCar retainCount]);
[sonCar release];
NSLog(@"friendCar = %lu ",[friendCar retainCount]);
[mamaCar release];
NSLog(@"sonCar = %lu ",[sonCar retainCount]);
[papaCar release];
NSLog(@"papaCar = %lu ",[papaCar retainCount]);
@interface Room : NSObject
/*
Room类有一个Person类型的属性:person
*/
//@property (nonatomic,assign)Person *person;
@property (nonatomic,retain)Person *person;
//-(void)setPerson:(Person *)person{
// _person = person;
//}
//重写dealloc方法
-(void)dealloc{
NSLog(@"打印room中的dealloc%s",__FUNCTION__,__LINE__);
[_person release];//重写了原有方法中没有的内容
[super dealloc];
}
// 对房间的相关操作
Person *newperson = [Person personWithName:@"lily" age:23];//1
Room * rooms = [[Room alloc] init];//1
rooms.person =newperson;//2
[newperson release];//1
[rooms release];//0-->调用自身dealloc方法销毁自身内存
//但是由于我们重写了dealloc方法,所以在销毁自身内存之前,会对Person类型对象通过_person指针发送release消息,让之前的retainCount为1的Person 类型对象retainCount减为0,系统会调用Person类自己的dealloc,来销毁Person类型对象所占有的内存空间
NSLog(@"who is in the room?\n%@",rooms.person);
相关文章推荐
- iOS 7计算文字的尺寸 示例代码
- iOS App集成Apple Pay教程(附示例代码)
- 收集各种 iOS App 开发可以用到的代码示例
- iOS状态栏的显示与隐藏的示例代码
- iOS开发数据库篇—SQL代码应用示例
- iOS 开发 UI 搭建心得(一)—— 驾驭 StoryBoard 代码示例:https://github.com/johnlui/Swift-On-iOS/blob/master/Differen
- iOS实现动态的开屏广告示例代码
- iOS屏幕旋转与锁屏的示例代码
- iOS中tableview 两级cell的展开与收回的示例代码
- iOS 使用AFN上传视频到服务器示例代码
- iOS App集成Apple Pay教程(附示例代码)
- iOS如何为圆角添加阴影效果示例代码
- Android、iOS和Java通用的AES128加密解密示例代码
- iOS 8新功能示例代码,为UILabel添加动画计数功能
- ios代码示例 实现快排算法
- iOS如何获取当前日期前后N天的时间示例代码
- iOS开发数据库篇—SQL代码应用示例
- IOS设置按钮为圆角的示例代码
- iOS实现只有底部边框线的输入框示例代码