黑马程序员_OC基础10_内存管理(多对象)
2014-03-23 12:39
399 查看
---------------------------------------- android培训、java培训、期待与您交流! ------------------------------------
一、内存管理相关概念(了解)
1、僵尸对象:所占用内存已经被回收的对象,僵尸对象不能再使用
2、野指针:指向僵尸对象(不可用内存)的指针,给野指针发送消息会报错(EXC_BAD_ACCESS: 访问了一块坏的内存(已经被回收、已经不可用的内存)
3、空指针:没有指向任何东西的指针(存储的东西是nil、NULL、0),给空指针发送消息不会报错(OC不存在空指针错误)
二、内存管理方法的使用(熟练掌握)
1、retain :计数器+1,会返回对象本身
2、release :计数器-1,没有返回值
3、retainCount :获取当前的计数器
4、 dealloc
1) 当一个对象要被回收的时候,就会调用
2)一定要调用[super dealloc],这句调用要放在最后面
三、内存管理原则(谨记!!!)
2)曾经让对象的计数器+1,就必须在最后让对象计数器-1
四、代码演示
1、创建两个对象Book和Person
1)Person声明 Person.h(Ps:人能拥有书,所以使用组合方式)
Person实现Person.m(严谨遵循内存管理思想!!!)
2)Book.m
3) main.m
4)程序输出:
五、内存管理代码规范:
1.只要调用了alloc,必须有release(autorelease)
对象不是通过alloc产生的,就不需要release
2.set方法的代码规范
1> 基本数据类型:直接复制
3.dealloc方法的代码规范
1> 一定要[super dealloc],而且放到最后面
2> 对self(当前)所拥有的其他对象做一次release
------------------------------------- android培训、java培训、期待与您交流! ---------------------------------------
一、内存管理相关概念(了解)
1、僵尸对象:所占用内存已经被回收的对象,僵尸对象不能再使用
2、野指针:指向僵尸对象(不可用内存)的指针,给野指针发送消息会报错(EXC_BAD_ACCESS: 访问了一块坏的内存(已经被回收、已经不可用的内存)
3、空指针:没有指向任何东西的指针(存储的东西是nil、NULL、0),给空指针发送消息不会报错(OC不存在空指针错误)
二、内存管理方法的使用(熟练掌握)
1、retain :计数器+1,会返回对象本身
2、release :计数器-1,没有返回值
3、retainCount :获取当前的计数器
4、 dealloc
1) 当一个对象要被回收的时候,就会调用
2)一定要调用[super dealloc],这句调用要放在最后面
三、内存管理原则(谨记!!!)
1、谁创建,谁release
1)如果你通过alloc、new或[mutable]copy来创建一个对象,那么你必须调用release或autorelease
2) 换句话说,不是你创建的,就不用你去[auto]release2、谁retain,谁release
1)只要你调用了retain,无论这个对象是如何生成的,你都要调用release2)曾经让对象的计数器+1,就必须在最后让对象计数器-1
四、代码演示
1、创建两个对象Book和Person
1)Person声明 Person.h(Ps:人能拥有书,所以使用组合方式)
#import <Foundation/Foundation.h> #import "Book.h"//导入所要组合的Book类 @interface Person : NSObject { Book * _book ; //定义book成员变量:由于演示内存管理,就先不用property,用手动get和set! } - (void)setBook:(Book *)book; - (Book *)book; @end
Person实现Person.m(严谨遵循内存管理思想!!!)
#import "Person.h"//导入Person头文件,在person.h文件中组合了Book类 @implementation Person - (void)setBook:(Book *)book{ if (book != _book ) //当传入对象为同一对象 { // 对当前正在使用的书(旧书)做一次release [_book release]; // 对新书做一次retain操作,使book计数器+1 _book = [book retain]; } } -(Book *)book{ return _book; } //当person计数器为0时,调用dealloc方法,打印:Person对象被回收! -(void)dealloc{ [_book release]; //当人死掉的时候,也要把书的计数器释放掉-1 NSLog(@"Person对象被回收!"); [super dealloc]; } @end
2)Book.m
#import "Book.h" //导入Book的声明,定义了成员变量price,此处省略Book.h代码 @implementation Book - (void) setPrice:(int)price{ _price = price; } - (int) price{ return _price; } //当book计数器为0时,调用dealloc方法,打印:Book对象被回收! -(void)dealloc{ NSLog(@"Book对象被回收!"); [super dealloc]; } @end
3) main.m
#import <Foundation/Foundation.h> #import "Person.h" //由于Person组合了Book,所以只要导入Person.h即可 int main() { //1、创建Book对象,当前Book计数器为1,b在使用book Book *b = [[Book alloc] init]; //创建Person对象,Person计数器为1 Person *p = [[Person alloc] init]; //2、p来使用b这本书,内部实现book计数器+1,当前book=2 [p setBook:b]; //3、变量b不想用这本书了,让book计数器-1 当前book=1; [b release]; //清空对象 b = nil; //4、当人p挂掉,也要负责把book计数器-1 当前book = 0 [p release]; p = nil; return 0; }
4)程序输出:
2014-03-23 11:57:02.338 内存管理[372:303] Book对象被回收! 2014-03-23 11:57:02.349 内存管理[372:303] Person对象被回收!
五、内存管理代码规范:
1.只要调用了alloc,必须有release(autorelease)
对象不是通过alloc产生的,就不需要release
2.set方法的代码规范
1> 基本数据类型:直接复制
- (void)setAge:(int)age { _age = age; }2> OC对象类型
- (void)setCar:(Car *)car { // 1.先判断是不是新传进来对象 if ( car != _car ) { // 2.对旧对象做一次release [_car release]; // 3.对新对象做一次retain _car = [car retain]; } }
3.dealloc方法的代码规范
1> 一定要[super dealloc],而且放到最后面
2> 对self(当前)所拥有的其他对象做一次release
- (void)dealloc { [_car release]; [super dealloc]; }
------------------------------------- android培训、java培训、期待与您交流! ---------------------------------------
相关文章推荐
- 黑马程序员——零基础学习iOS开发——10 Object-C 面向对象思想、OC语法简介、对象、类、
- 黑马程序员---学习笔记23:OC基础(10)内存管理
- 黑马程序员——OC基础---内存管理(引用计数器,多对象内存管理,set方法的内存管理,模型设计,循环引用)
- 黑马程序员——OC基础语法----类、对象、方法
- 黑马程序员---iOS基础---OC中类创建对象
- 黑马程序员——IOS基础——OC内存管理-set方法内存管理及微博模型设计
- 黑马程序员 OC中的内存管理及MRC和ARC单个对象的内存管理问题
- 黑马程序员——OC基础03—内存管理
- 黑马程序员-IOS-OC基础-内存管理
- 黑马程序员22——OC之内存管理(多个对象之间的内存管理)
- 黑马程序员——OC基础---手动内存管理
- 黑马程序员---成长之路-----OC之基础篇MRC内存管理
- 黑马程序员——OC语言基础——类与对象相关
- 黑马程序员_OC基础11_内存管理01
- OC基础—内存管理之多对象内存管理
- 黑马程序员——OC基础---面向对象语法
- 黑马程序员--ios基础--oc内存管理--@property参数、循环引用、autorelease
- 黑马程序员——OC基础——内存管理
- 黑马程序员——OC基础——内存管理(一)
- 黑马程序员——OC基础---内存管理