OC内存管理机制学习笔记

一、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];

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值