八天学会OC

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

2017-07-22  本文已影响20人  liyuhong
须读:看完该文章你能做什么?

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

上一篇下一篇

猜你喜欢

热点阅读