黑马程序员--Objective-C之--自动释放池的概念以及使用

今天我们来看一下OC中数组对象在是如何处理对象元素的引用计数问题的,同时介绍一下自动释放池的相关概念

一、数组对象是如何处理对象元素的引用计数问题

    //
    //  main.m
    //  26_NSArrayMemeryManager
    //
    //  Created by waterfoxjie on 15-03-29.
    //  Copyright (c) 2015年 waterfoxjie. All rights reserved.
    //  

    #import <Foundation/Foundation.h>  

    #import "Dog.h"  

    int main(int argc, const charchar * argv[]) {  

        Dog *dog1 = [[Dog alloc] init];
        Dog *dog2 = [[Dog alloc] init];  

        NSMutableArray *array = [[NSMutableArray alloc] init];  

        //数组会对每一个元素retain
        [array addObject:dog1]; //dog1计数=2
        [array addObject:dog2]; //dog2计数=2  

        [dog1 release];
        [dog2 release];  

        //当数组销毁的时候,会将所有的元素release
        [array release];//数组销毁  

        //当数组移除所有的元素的时候,会讲所有的元素release
        [array removeAllObjects];  

        return 0;
    }  

我们定义了Dog类,然后定义了NSMutableArray数组存放两个Dog对象,OC中在将对象放到数组中的时候,会自动调用retain方法,当数组对象本身被销毁的时候,会调用

所有元素的release方法,当移除数组中所有的元素的时候,会调用元素的release方法

二、自动释放池的概念

    //
    //  main.m
    //  27_AutoReleasePool
    //
    //  Created by waterfoxjie on 15-03-29.
    //  Copyright (c) 2015年 waterfoxjie. All rights reserved.
    //  

    #import <Foundation/Foundation.h>  

    #import "Dog.h"  

    int main(int argc, const charchar * argv[]) {  

        /*
        //创建一个自动释放池
        //有作用域的问题,在{}中定义的东西外部是不能访问的,这点和NSAutoreleasePool有区别的
        @autoreleasepool {//等价于[[NSAutoreleasePool alloc] init] 

            Dog *dog2 = [[Dog alloc] init];
            [dog2 retain]; 

        }//等价于[pool release] 

        //创建一个自动释放池
        NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 

        Dog *dog1 = [[Dog alloc] init];//计数:1 

        //将dog1对象加入到自动释放池中,却别于之前的release方法
        //加入到自动释放池中之后,不是代表我们不需要管理引用了,只是自动释放池自动会调用一次release
        //当自动释放池销毁的时候,释放池会对池中每一个对象调用一次release
        [dog1 autorelease];
        NSLog(@"dog1计数:%ld",dog1.retainCount); 

        //销毁自动释放池
        //这时候会调用dog1的release方法,dog1对象就被销毁了
        [pool release];
        */  

        //自动释放池的嵌套
        NSAutoreleasePool *pool1 = [[NSAutoreleasePool alloc] init];  

        //添加我们的代码
        //dog1放到了pool1中
        Dog *dog1 = [[Dog alloc] init];
        [dog1 autorelease];  

        //自动释放池的嵌套
        NSAutoreleasePool *pool2 = [[NSAutoreleasePool alloc] init];  

        //dog2放到了pool2中
        Dog *dog2 = [[Dog alloc] init];
        [dog2 autorelease];  

        //pool2销毁了
        [pool2 autorelease];  

        //pool1销毁了
        [pool1 release];  

        //下面的代码就是有问题的
        //[person setDog:[[Dog alloc] init];
        //正确的写法
        //Dog *dogs = [[[Dog alloc] init] autorelease];  

        return 0;
    }  

我们在之前的文章中,定义一个对象的时候都会产生一个自动释放池,然后在释放池中编写我们的代码,自动释放池是系统提供的一种帮助我们去管理对象的引用计数问题。

但是有时候代码必须在{...}中编写,这样的话就会产生作用域的问题,就是在{...}中定义的变量,在{...}外面不能使用。

所以OC中就有 了另外的一种方式:NSAutoreleasePool这个类

这种自动释放池可以实现嵌套

NSAutoreleasePool *pool1 = [[NSAutoreleasePool alloc] init];

//write code...
//pool1销毁了

[pool1 release];

上面的代码就相当于建立了一个自动释放池pool1,但是在这个中间的代码,如果要加入到这个池中,必须调用autorelease方法:

//dog1放到了pool1中
Dog *dog1 = [[Dog alloc] init];
[dog1 autorelease]; 

而且,这样定义一个池子还可以嵌套使用,直接看上面的例子代码,这样这个自动释放池我们就可以控制了。比系统提供的自动释放池可操作的地方很多

下面就直接对比一下:

NSAutoreleasePool *pool1 = [[NSAutoreleasePool alloc] init];

//这行代码就相当于系统自动释放池的
{

[pool1 release];

//这行代码就相当于系统自动释放池的
}

这样就好理解了吧

时间: 2024-10-27 00:42:15

黑马程序员--Objective-C之--自动释放池的概念以及使用的相关文章

黑马程序员——Java枚举和自动装箱

------- android培训.java培训.期待与您交流! ----------                                                                            枚举类和自动装箱     一.枚举      枚举由不重复的常量构成,在java中使用enmu关键字定义枚举,所有的枚举会自动继承java.lang.enmu. 比如定义交通灯的枚举. publicenumTrafficLamp { RED ,GREED,YEL

OC学习篇之---数组对象的引用计数问题和自动释放池的概念

之前一片文章中我们介绍了OC中的两个关键字@property和@synthesize的使用的使用: http://blog.csdn.net/jiangwei0910410003/article/details/41925967 今天我们来看一下OC中数组对象在是如何处理对象元素的引用计数问题的,同时介绍一下自动释放池的相关概念 一.数组对象是如何处理对象元素的引用计数问题 // // main.m // 26_NSArrayMemeryManager // // Created by jian

(转载)OC学习篇之---数组对象的引用计数问题和自动释放池的概念

之前一片文章中我们介绍了OC中的两个关键字 @property 和 @synthesize 的使用的使用,今天我们来看一下OC中数组对象在是如何处理对象元素的引用计数问题的,同时介绍一下自动释放池的相关概念 一.数组对象是如何处理对象元素的引用计数问题 1 // 2 // main.m 3 // 26_NSArrayMemeryManager 4 // 5 // Created by jiangwei on 14-10-12. 6 // Copyright (c) 2014年 jiangwei.

黑马程序员_Java基本数据的自动拆装箱及享元设计模式视频学习笔记

装箱:把基本数据类型装成java类(被托管?). 拆箱:把java类拆成基本数据类型(取消托管?). java新版本增加了自动装箱拆箱的特性,使得java基本类和基本数据类型可以无需转换直接参与计算.如: Integer iObj = 3 //自动装箱. system.out.println(iObj + 12);//自动拆箱. 在较早版本中不支持自动装箱拆箱,以上两句语句是错误的.  知识点1: 在装箱时,将基本数值类型装成java类Integer对象, 如: Integer i1 = 13:

OC中对象元素的引用计数 自动释放池的相关概念

OC中数组对象在是如何处理对象元素的引用计数问题的,同时介绍一下自动释放池的相关概念 一.数组对象是如何处理对象元素的引用计数问题[objc]  view plaincopy 1. //   2. //  main.m   3. //  26_NSArrayMemeryManager   4. //   5. //  Created by jiangwei on 14-10-12.   6. //  Copyright (c) 2014年 jiangwei. All rights reserve

黑马程序员-OC学习笔记之autorelease与自动释放池

---------------------- IOS开发.Android培训.期待与您交流! ---------------------- 一.autorelease autorelease与release相似,是OC中的一个对象方法.这两个方法都能把对象的引用计数器减1,但是release是一个精确的减1,对对象的操作只能在release之前进行,如果是在之后,就会出现野指针错误:而autorelease是一个不精确的引用计数器减1,当给对象发送autorelease消息时,对象就会被放到自动

黑马程序员----内存管理之四——《autorelease自动释放池》

内存管理之四——autorelease自动释放池 1.autorelease的基本使用 此对象方法会将对象放到一个自动释放池内: 当自动释放池被销毁时,就会对池子内的所有对象做一次release操作: 此方法会返回对象本身: 调用完此方法后,对象计数器的值不变,只有到自动释放池被销毁时才会对对象做一次release操作: 2.autorelease的好处 不用在关心对象被销毁的时间: 不用关心什么时候调用release操作: 3.autorelease的使用注意 占用内存较大的对象不要随便使用a

黑马程序员_JAVA 基础加强学习笔记

一.面向对象 (一)继承  1.继承的好处: (1) 提高了代码的复用性. (2) 让类与类之间产生了关系,提供了另一个特征多态的前提. 注意: 子类中所有的构造函数都会默认访问父类中的空参数的构造函数,因为每一个子类构造内第一行都有默认的语句super();  如果父类中没有空参数的构造函数,那么子类的构造函数内,必须通过super语句指定要访问的父类中的构造函数. 如果子类构造函数中用this来指定调用子类自己的构造函数,那么被调用的构造函数也一样会访问父类中的构造函数. 2.final特点

黑马程序员___多线程小结

----------- android培训.java培训.java学习型技术博客.期待与您交流! --------- 进程和线程 进程是正在进行中的程序,指一个内存中运行的应用程序,每个进程都有自己独立的一块内存空间,一个进程中可以有多个线程. Java程序的进程里有几个线程:主线程, 垃圾回收线程(后台线程) 线程是指进程中的一个执行任务(控制单元),一个进程中可以运行多个线程,多个线程可共享数据.多线程:在同一个进程中同时运行的多个任务;一个进程至少有一个线程,为了提高效率,可以在一个进程中