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,如需转载请自行联系原作者

相关文章
|
缓存 关系型数据库 MySQL
MySQL慢查询优化策略
MySQL慢查询优化是一个复杂的过程,需要根据具体的应用场景和数据特点进行。以上策略是提升数据库查询性能的有效途径,但最关键的是对系统进行持续的监控和分析,及时发现并解决性能瓶颈。通过实践这些策略,你可以显著提高MySQL数据库的性能,为用户提供更快的响应时间和更好的体验。
583 10
|
存储 测试技术
【数据结构】手把手分析:链式二叉树的实现
【数据结构】手把手分析:链式二叉树的实现
393 5
|
存储
宇宙竟是一个智能体?万物智能演化Ω理论,探索宇宙终极之迷
《从观察者到智能体:论物理学与智能科学的统一》提出“万物智能演化Ω理论”,旨在融合物理学与智能科学,构建智能体与宇宙演化的统一模型。通过定义智能体的基本能力和极端状态,探讨智能体在α引力和Ω引力作用下的演化过程,为理解宇宙提供新视角。论文链接:https://doi.org/10.20944/preprints202410.0479.v1
407 2
|
Linux 开发工具
【专栏】Linux 必备技能:Vim文本编辑器中快速跳转到文件开头和结尾的方法
【4月更文挑战第28天】本文介绍了Vim文本编辑器中快速跳转到文件开头和结尾的方法。使用`gg`或`1G`可跳转到文件开头,`G`或`$`则用于跳转到结尾。此外,还提到了跳转到指定行(如`10G`)和查找特定字符(如`f`+字符)的技巧,以提升编辑效率。
3617 0
|
架构师 Java 数据安全/隐私保护
Fiddler安装和使用
Fiddler安装和使用
860 0
|
定位技术 项目管理
5W2H分析法:全面思考和解决问题的实用工具
5W2H分析法又叫七问分析法,创于二战中美国陆军兵器修理部。发明者用五个以W开头的英语单词和两个以H开头的英语单词进行设问,发现解决问题的线索,寻找发明思路,进行设计构思,从而搞出新的发明项目。5W2H简单、方便,易于理解,实用,富有启发意义,广泛用于企业管理和技术活动,对于决策和执行性的活动措施也非常有帮助,也有助于弥补考虑问题的疏漏。
2277 0
|
安全 数据安全/隐私保护 开发者
windows怎么上传ipa到AppStore?无需Mac无需苹果电脑解决办法!
windows怎么上传ipa到AppStore?无需Mac无需苹果电脑解决办法!
windows怎么上传ipa到AppStore?无需Mac无需苹果电脑解决办法!
|
Kubernetes 负载均衡 数据中心
K8s学习笔记(3)——Namespace,Pod,Label,Deployment,Service
K8s学习笔记(3)——Namespace,Pod,Label,Deployment,Service
535 1
|
XML 开发框架 运维