一、OC内存管理机制有三种
1、引用计数
2、ARC
3、垃圾回收(仅在mac 台式机 中 在iPhone iPai 中没有)
二、原理分析
1、程序崩溃情况:
(1)多次释放 使得程序崩溃
Student * zhang = [[Student alloc] init];
[zhang release];
[zhang release];
(2)多个对象没有释放,占用太多内存使得程序给OS杀死
Student * zhang = [[Student alloc] init];
//引用计数加1
[zhang retain];
[zhang release];
(3)如果都没有对象去释放他
Student * zhang = @"123";
[zhang release];
2、内存管理是基于对象所有权进行管理
(1)如何一个对象都可以有一个或者多个所有者。当一个对象没有了所有者,系统自动析构它。
(2)使用alloc、new、copy、mutableCopy等方法创建对象,拥有对象的所有权(引用计数+1)
(3)可以使用reatin来实现对一个对象的所有(引用计数加1),可能是别人产生的对象,害怕别人释放对象
(4)不需要一个对象时,必须放弃对象的持有(release 引用计数-1,为0时候回收)
(5)autorelease:对象不能立刻释放,使对象的引用计数在未来的某个时间点由系统自动引用计数-1 (自动释放池 由系统管理 基本可以通过{}来判断 结束时候玩释放池里都发送一条release消息)
@autoreleasepool{
需要释放的代码
}
如果不释放 result的内容 调用的人不清楚释放他会造成内存泄露
-(Complex *)add:(Complex *)aSecond
{
Complex *result = [[Complex alloc]init];
result.real = real+aSecond.real;
result.imaginary = imaginary + aSecond.imaginary;
return [result autorelease];
}
//调用
Complex *ans = [c1 add:c2];
3、相关方法 NSObject 继承来的方法
-(id) retain;
对象引用计数+1,返回对象本身
-(void) release;
对象引用计数-1
-(unsigned)retainCount
引用计数
-(void)dealloc;
引用计数个数为0,时系统调用 析构~
3、set正确写法 @property(nonatomic,retain) NSString*name;//对象类型
//自动生成如下的方法
-(void)setName:(NSString)*aName
{
[aName retain];
[name release];
name = aName;
}
//相当于@property(retain) NSString*name
//自动生成如下的方法set和get方法
-(void)setName:(NSString)*aName
{
if(name!=aName)
{
[name release];
name = [aName retain];
}
}
@property(nonatomic,assign) int age;//值类型 没有引用计数
-(void)dealloc{
[name release];
name = nil;
//相当于上面两句
self.name = nil;
[super dealloc];
}
4、容易错误的点
Student *zhang = [[Student alloc]init];
zhang.name = [NSString alloc]initWithFromat:@"张三"];//错误 会内存泄露
/********/正确
NSString *temp = [[NSString alloc]initWithFromat:@"张三"];
zhang.name = temp;
[temp release];
/********/或者直接使用类方法
NSString *name = [NSString stringWithFromat:@"张三"];
[zhang release];