oc52--autorelease1

简介:
复制代码
//
//  main.m
/*
 autorelease也是用于内存管理的,给对象发送autorelease消息就会把对象放入autoreleasepool这个池子中,当池子销毁的时候会对池子里面的所有对象发送一条release消息,只是计数器减一,不一定会销毁。
 1.autorelease方法会返回对象本身,好比init方法,
    Person *p = [Person new];
    p = [p autorelease];
 2.调用autorelease方法不会对对象的引用计数器加1。
 3.不需要写release方法。
 */


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

int main(int argc, const char * argv[]) {
    
     //需要把项目了 变成手动内存管理MRC
    @autoreleasepool {
         Person *p3  =[[Person alloc] init];
         [p3 run];
         
         // 时时刻刻都关注对象什么时候被释放
         [p3 release];
         p3 = nil;
         
         // 给野指针发送消息
         [p3 run];
    }
    
    
    
    Person *p4 = nil;
    @autoreleasepool { // 创建一个自动释放池
        p4 = [[Person alloc] init]; // 1
        // 不用关心对象什么时候释放, 只要能够访问p的地方都可以使用p
        p4 = [p4 autorelease]; // 只要调用了autorelease,将对象p放入自动释放池中,当自动释放池释放的时候,会池里面的所有对象发送一条release消息。
        NSLog(@"%lu",[p4 retainCount]);  //1
        
        p4 = [p4 autorelease];
        p4 = [p4 autorelease];
        p4 = [p4 autorelease];
        p4 = [p4 autorelease];
        p4 = [p4 autorelease];
        NSLog(@"%lu",[p4 retainCount]);  //1
        [p4 retain]; // 2
        
        [p4 run];
    } // 自动释放池销毁了, 给自动释放池中所有的对象发送一条release消息
    NSLog(@"%lu",[p4 retainCount]);
    [p4 retain];
    NSLog(@"%lu",[p4 retainCount]);
    [p4 run];
    
    
    

    // autorelease其它写法
    @autoreleasepool {
//        Person *p = [[Person alloc] init];
//        p = [p autorelease];
        Person *p  = [[[Person alloc] init] autorelease];
        [p run];
    }
    
    
    
    
    // ios5以前的写法:创建一个自动释放池
    // 自动释放池只是将release延迟了而已
    
    NSAutoreleasePool *pool5 = [[NSAutoreleasePool alloc] init];
    
    Person *p5 = [[[Person alloc] init] autorelease];
    [p5 run];
    
    // 销毁一个自动释放池
    [pool5 release];
    
    return 0;
}
复制代码
复制代码
//  Person.h

#import <Foundation/Foundation.h>

@interface Person : NSObject

    - (void)run;

@end
复制代码
复制代码
//  Person.m

#import "Person.h"

@implementation Person

    - (void)run
    {
        NSLog(@"%s", __func__);
    }

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

@end
复制代码

 


本文转自农夫山泉别墅博客园博客,原文链接:http://www.cnblogs.com/yaowen/p/7428721.html,如需转载请自行联系原作者

相关文章
|
存储 JSON 数据格式
pyhton爬取爱豆(李易峰)微博评论
今日目标:微博,以李易峰的微博为例:
276 0
|
存储 运维 Linux
mount 挂载操作 | 学习笔记
快速学习 mount 挂载操作。
|
SQL 弹性计算 安全
飞天加速计划续领任务文章
我之前有幸参与飞天加速计划,获得了一台阿里云ECS服务器,用于搭建网站,下面是一些经验与收获。
|
Linux
fedora kde 4.2插入耳机,外放与耳机同响问题
最近清理出了一个KDE人配置文件,重新使用了新的配置文件。在播放音乐的时候,耳机与外放会同里响 设置如下 菜单-系统设置-多媒体-Phonon-音频硬件设置-设备配置-连接器-Anolog headphones 如果这时候耳机是正常了,但是拔下耳机后,外放声音没了.
860 0
fedora kde 4.2插入耳机,外放与耳机同响问题
|
机器学习/深度学习 人工智能 自然语言处理
AI平台-NeuronBlocks【NLP工具】
NeuronBlocks是一个模块化NLP深度学习建模工具包,可以帮助工程师/研究者们快速构建NLP任务的神经网络模型。 该工具包的主要目标是将NLP中深度神经网络模型构建的开发成本降到最低,包括训练阶段和推断阶段。
1484 0
|
程序员
《编程原本 》一1.4 过程
本节书摘来自华章出版社《编程原本 》一书中的第1章,第1.4节,作者(美)斯特潘诺夫(Stepanov, A.),(美)麦克琼斯(McJones, P.),更多章节内容可以访问云栖社区“华章计算机”公众号查看
1033 0