内存管理
来源:互联网 发布:深圳几米软件 编辑:程序博客网 时间:2024/04/29 04:59
一 内存的介绍.
1.OC管理的内存是堆区.栈区是由系统管理的.
2.栈区 : 变量都在栈区 , 但是static修饰的变量在静态区 , const 修饰的变量在常量区 .
int a = 10 ; 变量a 在栈区,
Person *p = [[Person alloc] init] ; 指针变量 p 在栈区 , 它所指向的对象(内存)在堆区 .
3.堆区的内存不能有名字(不能命名) .
二 局部变量和成员变量的区别
局部变量 : 是在方法内部定义的变量 , 变量名的生命周期是只在方法内部有效 , 也就是说在那个大括号内定义,就在那个大括号内有效 .
例如 :
-(void)change
1{
NSString *a = @“hello” ;
2{
NSString *b ;
}
for (int i = 0;i < 10; i ++)
3{
BOOL judge = NO ;
}
}
a 的生命周期是最外层的大括号1.
b 的生命周期是大括号2
c 的生命周期是大括号3
成员变量 : 成员变量在整个类内有效 . 只有类释放了成员变量才会释放 .
三 内存问题(为什么要进行内存管理)
1 野指针问题 :
栈区的指针存在,但是堆区的对象(内存)却释放了 .
2 内存泄漏
堆区的存在,但是栈区的指针释放了 .
四 内存管理原则
1 . 保证在使用的时间是安全的,保证不使用的时候消失.
2 . 谁让引用计数 +1 , 谁负责引用计数 -1;
3 . 类方法的引用计数 : 通过类方法创建的对象是自动释放的.它已经添加到自动释放池中 ;
4 . 遍历构造器返回的对象是放到自动释放池中的 .
五 自动释放池
1 创建一个自动释放池(老版本)
NSAutoreleasePool *pool1 = [[NSAutorelease alloc ] init] ;
NSAutoreleasePool *pool = [[NSAutorelease alloc ] init] ;
Car *car = [ [Car alloc] init];
//只有autorelease修饰的对象,才能添加到离这个对象最近的自动释放池中 .
[car autorelease]; // car 在pool中
[pool release ] ;
[pool1 release];
2 . 新版本
@autoreleasepool{
Car *car = [ [Car alloc] init ] ;
}
六 . 总结
1 . 如果在类中声明了成员变量,那么成员变量的创建必须在init中且必须保证引用计数为1,并在dealloc中释放.
2 . 如果在类中声明了属性 , 那么对属性赋值的时候必须通过.语法来进行赋值(为了保证引用计数为1且避免内存泄漏)且必须在dealloc中释放.
0 0
- 内存管理
- 内存管理
- 内存管理
- 内存管理
- 内存管理
- 内存管理
- 内存管理
- 内存管理
- 内存管理
- 内存管理
- 内存管理
- 内存管理
- 内存管理
- 内存管理
- 内存管理
- 内存管理
- 内存管理
- 内存管理
- uva11235(RMQ问题)
- Qt中PostgreSQL数据库驱动插件的编译
- JAVA---揭秘StringBuffer的capacity
- 【.Net码农】WPF 模拟UI 键盘录入
- POJ2352 Stars
- 内存管理
- LeetCode OJ 之 Candy (糖果数量)
- 类和继承总结
- 排序算法之堆排序
- oracle10g监听器无法启动,提示“错误1067:进程意外终止”
- 堆栈的链式储存实现
- android学习之旅
- 2015年计划
- Postgis