zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    提取数据用strpos函数比较,预期和实际不符问题解决
    thinkphp模板中foreach循环没数据的错误解决
    错误之thinkphp模型使用发生的错误
    ThinkPHP添加模板时,犯的三个错
    mysql中的comment用法
    在cmd下输入/g无效
    Windows下PHPUnit安装
    python中string.casefold和string.lower区别
    python3数据类型
    python终端颜色设置
  • 原文地址:https://www.cnblogs.com/yaowen/p/7428721.html
Copyright © 2011-2022 走看看