@autoreleasepool学习记录

1. 和Java的GC不同,这个自动释放池是“半自动的”。当自动释放池销毁的时候, 里面所有的调用过autorelease方法的对象调用一次release方法。


2. 如何创建一个自动释放池:@autoreleasepool{
     
}

大括号表示里面所有的对象会被添加到这个自动释放池中。
当大括号结束的时候销毁自动释放池。


3. 怎样将对象加入自动释放池呢?只需要对对象发送一条autorelease消息即可。该对象会被添加到最近的一个自动释放池中。(栈顶的释放池(消息循环Runloop(类似于Android的消息队列)))

4. 发送autorelease消息的实质:把对象的release方法的调用延迟了。当其所在的自动释放池销毁了,才调用对象的release方法。


5. 注意:autorelease不会改变引用计数器。它延迟调用的release方法才会使引用计数器-1.



6. 可以利用autorelease方法,快速创建一个类并且不需要考虑内存。使用静态方法,并且方法名和类名相同,只是首字母改成小写。系统自带的很多类都是如此。


注意:下面的代码是在ARC模式关闭时:

Student.h

#import <Foundation/Foundation.h>

@interface Student : NSObject

//静态方法快速创建一个类
+(id) student;
@end



Student.m

#import "Student.h"

@implementation Student

+(id)student {
    Student *student = [[[Student alloc] init]autorelease];
    
    return student;
}

-(void)dealloc {
    NSLog(@"%@被释放了", self);
    [super dealloc];
}
@end


main.m

#import <Foundation/Foundation.h>
#import "Student.h"

int main(int argc, const char * argv[])
{

    @autoreleasepool {
        
        //Student *student = [[[Student alloc] init] autorelease];
        Student *student = [Student student];
    }
    return 0;
}

7. 注意点:由于autorelease是延迟release,尽量不要对大的内存调用这个方法,因为会被延迟到自动释放池销毁后才release。


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值