第06天OC语言(01):autorelease基本概念

  • 不要等到明天,明天太遥远,今天就行动。

#####须读:看完该文章你能做什么?

1.能知道什么是autoreleasepool。

#####学习前:你必须会什么?(在这里我已经默认你具备C语言的基础了)

什么是release/retain,什么是野指针


#####一、本章笔记

 一、为什么要什么到自动释放池
    比如写release的时候 ,我们在release下面调用了对象方法 可能会出现野指针访问
    这样的情况下,我们需要时时刻刻关注对象 什么时候释放 
    这时候 就出现了自动释放池
 二、创建自动释放池的两种方式 
    iOS5.0之后(推荐)
    @autoreleasepool {
        // 在这里面使用的对象 都会加到自动释放池里面,当过了自动释放池代码块之后
        都会对里面的对象 进行一次release消息 (不是销毁对象,而是release消息)
    }
    iOS5.0之前
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc]init];
    // ... 中间就是将所有的对象加入到自动释放池
    // 销毁一个自动释放池
    [pool release];
 三、对象加入自动释放池的两种写法(调用autorelease方法的时候 ,会返回本身)
    写法1
    Person *p = [[[Person alloc]init] autorelease]; // 推荐使用
    写法2
    Person *p = [[Person alloc]init];
    p = [p autorelease];

#####二、code ######main.m

#pragma mark 01-autorelease基本概念
#pragma mark - 代码
#import <Foundation/Foundation.h>
#pragma mark 类
#import "Person.h"
#pragma mark - main函数
int main(int argc, const char * argv[])
{
    
    // iOS5.0之后写法
    /*
    @autoreleasepool {
//         Person *p  = [[Person alloc]init];
//         [p run];
//         // 时时刻刻都要关注对象 什么时候 释放
//         [p release];
//         [p run]; // 给野指针发消息 会报错
        
        Person *p = [[Person alloc]init];
        // 不用关心对象 什么时候 释放, 只要能够访问p的地方 都可以使用p
        p = [p autorelease]; // 只要调用了autorelease,那么就不用调用release了
//        [p retain];
        [p run];
        [p run];
        [p run];
    }
     */
#pragma autorelease其他写法1
    @autoreleasepool {
//        Person *p = [[Person alloc]init];
//        p = [p autorelease];
        Person *p = [[[Person alloc]init] autorelease];

        [p run];
    }
    
#pragma autorelease其他写法2
    // 创建一个自动释放池
    // 自动释放池 只是 将release延迟了而已
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc]init];
    Person *p = [[[Person alloc]init] autorelease];
    [p run];
    // 销毁一个自动释放池
    [pool release];
    return 0;
}

######Person

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

@interface Person : NSObject

- (void)run;

@end

>>>.m
#import "Person.h"

@implementation Person

- (void)run
{
    NSLog(@"%s",__func__);
}
- (void)dealloc
{
    NSLog(@"%s",__func__);
    [super dealloc];
}

@end

转载于:https://my.oschina.net/u/3561184/blog/1438771

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值