oc52--autorelease1

本文深入讲解了Objective-C中autorelease的使用方法及其在内存管理中的作用。通过实例代码演示了autorelease如何帮助开发者更好地管理对象的生命周期,并解释了autorelease与retain计数的关系。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值