IOS内存管理机制

学习过java的人都知道,java中用一个变量引用对象,如果引用不存在,就回收这个对象。

现在大家都用Xcode6来开发程序,都不怎么注意内存回收机制的问题,感觉就跟java的垃圾回收机制一样,但是我们要注意的是ios并不支持垃圾回收机制,只不过他们都不需要我们显式的管理内存;

oc中只有继承了NSObject对象才需要管理内存,每个对象内部都有一个整数引用计数器,当对象的引用计数器等于0时,就销毁对象。它占用的内存也好被系统回收,oc也会自动向对象发送一条dealloc消息,我们一般会重写dealloc方法(相当于一个对象的遗言我们可以在里面做内存管理的一些操作),retainCount可以获得当前的计数器值。

IOS内存管理机制有三种:

1、ARC(automatic reference counting 自动引用计数,注意跟垃圾回收机制完全不同)

ARC是IOS5以后的编译器新特性,而不是iOS运行时特性(除了weak指针系统)arc就是相当于在适当的地方帮我们插入retain,release,autorelease等方法;

ARC的规则非常简单:只要还有一个变量指向对象,对象就会保持在内存中。当指针指向新值,或者指针不再存在时,相关联的对象就会自动释放。这条规则对于实例变量、synthesize属性、本地变量都是适用的。

注意:

不要把大量循环操作放到同一个自动释放池里面,会造成内存峰值上升;

对于大内存占用的尽量少使用arc,因为是延迟释放机制,所以会导致用完一直放在那边等到最后回收;



2、自动释放池

5.0版本之后:

    Student *stu = [[Student alloc]init];
    @autoreleasepool {
        [stu autorelease];
    	@autoreleasepool {
    	}
    }
5.0之前版本:

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc]init];
//5.0之前版本
[pool release];
系统会生成很多自动释放池,调用autorelease会把stu对象扔进池子里面,自动释放池销毁,池子里面所有对象都会调用release方法,计数器-1(但是不代表对象一定会被销毁);

当我们pool 调用release消息时,他会向池中所有对象发送一条release消息,并且销毁自身;当pool调用drain时,并不会销毁自身。

如下对象在第一个池子被销毁,并不会把stu销毁:

    Student *stu = [[Student alloc]init];
    @autoreleasepool {
        [stu autorelease];
        @autoreleasepool {
            [stu retain];
            NSLog(@"pool2 is exit");
            NSLog(@student :%i",[stu retainCount]);
        }
        NSLog(@"student :%i",[stu retainCount]);
    }
    [stu release];

3、手动释放内存

理念:谁创建谁释放,谁污染谁治理 

alloc、new、copy、retain计数器+1,release计数器—1

就是自己调用alloc,new,retain,copy 自己就要调用release,当计数器为0时系统自动施放对象

重写dealloc方法一定要调用系统[super dealloc];

retain是指被该关键字修饰的对象被引用时,引用的是同一块地址
copy是指在内存中重新开辟了一块地址,单内容与传入对象相同

野指针错误就是访问了已经被释放的内存,所以[obj release];不能在释放对象之后被调用;

NSLog(@"%zi",[student retainCount])

nonatomic代表set跟get不需要加锁,assign是默认的get跟set,没有做内存管理
@property (nonatomic,retain)NSString *name;(系统自动生成的setter方法)
- ( void )setName:( NSString  *)str

{

    [name release];

    name = [str retain];

}


最后总结一下: IOS通过静态的方法返回的对象不需要我们管理内存(自己定义静态方法也不应该让调用者管理内存);ARC不是垃圾回收机制,垃圾回收机制是完全不需要自己管理内存,arc是编译器自动帮我们生成内存管理的代码


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值