• OC基础 自动释放池


    #import <Foundation/Foundation.h>
    #import "Person.h"
    int main(int argc, const char * argv[]) {
        @autoreleasepool {
            
            //自己创建的对象 虽然放在自动释放池中,但是不受管理 加上 autorelease 管理
            
            Person* p =[[[Person alloc]init]autorelease];
            p.age=25;
    //        [p release];
            [p retain]; //引用计数+1   加入对象池 只会进行一次销毁操作 如果对象引用计数为0,会被销毁
            
    
        }
        return 0;
    }

    person.h

    @interface Person : NSObject
    
    @property(nonatomic,assign)int age;
    +(Person*)personWithAge:(int)age;
    -(void)lotsOfObject;
    @end

    person.m

    #import "Person.h"
    
    @implementation Person
    // 类方法中创建延时对象 ,因为要返回给别人使用,所以无法立即销毁, 通过给这个对象发送autorelease消息 让它延迟释放
    +(Person*)personWithAge:(int)age
    {
        
        Person* p =[[[Person alloc]init]autorelease];
        p.age=age;
    //    [p release]
        return p;
        
    }
    -(void)lotsOfObject
    {
        // 当一个方法中,创建了大量的需要延迟释放的对象,并且这些对象在方法结束后不在使用,最好的方法加入独立的自动释放池,以保证这些对象能够得到有效的,及时的释放
        @autoreleasepool {
            // 创建大量需要延迟的代码
            for(int i=0;i<1000;i++)
            {
                Person* p=[Person personWithAge:i];
                
            }
            
        }
        NSLog(@"lotsOfObject end");
        
    }
    
    
    
    -(void)dealloc
    {
        NSLog(@"Person dealloc");
        [super dealloc];
        
    }
    
    @end

    mian

    //3.自动释放池在销毁时,会给受它管理的每个对象发送一次release消息 如果对象引用计数为0 ,对象会销毁
    
    //4       不要滥用自动释放池,因为自动释放池只有它在销毁时才会受它管理的对象做释放,如果程序中创建了大量的对象,这些对象就得不到有效,及时的释放
    //5.自动释放池可以有多个 并且可以嵌套,自动释放池采用栈的结构来管理,创建一个自动释放池,它就被压入栈,栈顶总是离你代码最近的自动释放池
    
    
    
    #import <Foundation/Foundation.h>
    #import "Person.h"
    int main(int argc, const char * argv[]) {
        @autoreleasepool {
            
            //自己创建的对象 虽然放在自动释放池中,但是不受管理 加上 autorelease 管理
            
            Person* p =[[[Person alloc]init]autorelease];
            p.age=25;
    //        [p release];
    //        [p retain]; //引用计数+1   加入对象池 只会进行一次销毁操作 如果对象引用计数为0,会被销毁
           
            @autoreleasepool {
                 Person* p2=[Person personWithAge:30];
                [p2 lotsOfObject];
                @autoreleasepool {
                    Person* p3=[Person personWithAge:35];
                }
                
                    NSLog(@"lotsOfObject2 end");
    
            }
            
    
        }
        // 第二种方法创建自动释放池
        NSAutoreleasePool* pool=[[NSAutoreleasePool alloc]init];
        Person* p3=[Person personWithAge:35];
        
        [pool release];
        
        
        
        return 0;
    }
  • 相关阅读:
    Linux模拟网络延迟、丢包等
    TestLink汉化操作
    onems设备管理系统(TR-069和OMA)
    Installation Guide Ubuntu 16.04
    Configure GenieACS
    Linux下的tar压缩解压缩命令详解
    genieacs Installation on Ubuntu14.04
    Pyqt中富文本编辑器
    安装MongoDB
    到底什么是贝叶斯?
  • 原文地址:https://www.cnblogs.com/zhangqing979797/p/13258139.html
Copyright © 2020-2023  润新知