IOS内存管理示例代码
来源:互联网 发布:二合一沐浴露 知乎 编辑:程序博客网 时间:2024/05/23 14:30
内存管理的是—> 堆内存部分
内存—> 堆、栈、全局《包含常量区》、系统自带
内存管理原则:
1.凡是alloc 、retain、copy的地方,都应出现release 或是 autorelease与之对应;
2.属性为retain 或 copy 时,需要在类的dealloc 中释放此属性;
3.便利构造器本身包含autorelease;
4.一定不要释放没有所有权的对象,不要手动调用dealloc;
OC -----内存管理
OC 的两大机制:
1、消息传递机制<方法调用>
2、引用计数;
属性的作用
1.声明实例变量
2.setter和Getter方法 及实现
copy —>针对的是特殊的对象类型
必须遵守了NSCopying协议的对象
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];
}
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 * 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]);
/*
Room类有一个Person类型的属性:person
*/
//@property (nonatomic,assign)Person *person;
@property (nonatomic,retain)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);
0 0
- IOS内存管理示例代码
- 内存共享代码示例
- 管理示例代码
- Swift内存管理-示例讲解
- [Swift内存管理-示例讲解]
- Swift内存管理-示例讲解
- IOS 内存管理
- iOS内存 管理 一点
- ios内存管理
- IOS内存管理小结
- iOS内存管理
- 再论iOS内存管理
- iOS内存管理
- IOS 内存管理
- IOS内存管理
- IOS内存管理
- iOS内存管理
- ios 内存管理基础知识
- 互联网协议基本介绍 (2)
- JavaScript中的单例模式
- C#与android中DES与base64的相互转换
- 高斯日记
- 程序员10大境界
- IOS内存管理示例代码
- 你必须非常努力,才能看起来毫不费力!
- NYOJ663 弟弟的作业
- CentOS查看树形目录命令tree的安装
- 女人,是不是非要让爱情占据你的一切?
- jquery中获得table中第几个td元素的值
- 数据库中的主键与外键
- Android游戏开发----JNI小结
- setuptools 安装PIL等第三方模块出现错误,以及UnicodeDecodeError: 'ascii' codec can't decode byte.原因和解决方案