为什么要内存管理?
因为内存一直被占用的话,内存最终会不够用。
内存管理好处,1G可以运行3G应用,只要使用时不超过1G,及时释放的话。
一.oc中采用“引用计数”(retainCount)方式管理对象所占内存(内存有指针指向的概念)。
二.
三.属性中内存管理
四.便利构造器内存管理
五.检测工具
Teacher.h
@interface Teacher : NSObject -(void)onClass; @end
Teacher.m
#import "Teacher.h" @implementation Teacher -(void)onClass { NSLog(@"teacher is on class"); } @end
Student.h
#import "Teacher.h" @interface Student : NSObject { Teacher *_teacher; } //@property(nonatomic,retain)Teacher *teacher; -(void)setTeacher:(Teacher *)aTeacher; -(Teacher *)teacher; @end
Student.m
#import "Student.h" @implementation Student //@synthesize teacher = _teacher; //retain中@synthesize默认手动写法 -(void)setTeacher:(Teacher *)aTeacher { if (_teacher != aTeacher)//不等的时候赋新值 { [_teacher release];//_teacher释放?第一次_teacher是nil(对nil release没影响),但是如果后面还要把对象赋给_teacher的话,这里必须先释放 _teacher = [aTeacher retain];//把所有权给_teacher。copy的话这里也改为[aTeacher retain] } } -(Teacher *)teacher { return _teacher; } -(Student *)init { self = [super init]; if (self) { } return self; } //重写 -(void)dealloc { [_teacher release];//属性中retain,这里也要release NSLog(@"我(%@)快要被释放了。。。。。",self);
[super dealloc];//第一步必须做的,保留父类释放
} @end
AppDelegate.m
/* Student *s = [[Student alloc]init]; NSLog(@"reatinCount = %d",s.retainCount); [s retain]; NSLog(@"reatinCount = %d",s.retainCount); [s release]; NSLog(@"reatinCount = %d",s.retainCount); [s release]; NSLog(@"reatinCount = %d",s.retainCount); */ //属性的内存管理 Teacher *t = [[Teacher alloc]init]; Teacher *t2 = [[Teacher alloc]init]; Student *stu = [[Student alloc]init]; stu.teacher = t; stu.teacher = t2; [t release]; [t2 release]; //sleep(10);//让系统休眠10秒 [stu.teacher onClass]; [stu release]; /* Student *s1 = [[Student alloc]init]; Student *s2 = s1; NSLog(@"s2 = %d",s2.retainCount); [s2 retain];//2 NSLog(@"s1 = %d",s1.retainCount); NSLog(@"s2 = %d",s2.retainCount); [s1 release]; NSLog(@"s1 = %d",s1.retainCount); NSLog(@"s2 = %d",s2.retainCount); */
原文:http://www.cnblogs.com/huen/p/3521276.html