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

---------------------- IOS开发Android培训、期待与您交流! ----------------------

一、autorelease

autorelease与release相似,是OC中的一个对象方法。这两个方法都能把对象的引用计数器减1,但是release是一个精确的减1,对对象的操作只能在release之前进行,如果是在之后,就会出现野指针错误;而autorelease是一个不精确的引用计数器减1,当给对象发送autorelease消息时,对象就会被放到自动释放池中,自动销毁时会给池中的所有对象发送release消息,使得所有对象的计数器减1,所以本质上autorelease还是会调用release。

二、自动释放池

上面小桥说了,autorelease对象方法会把对象放到自动释放池中,那么什么是自动释放池呢?如果读者看了第一篇笔记,就会知道小桥曾经把Xcode自动生成的代码做过删减,因为那时小桥还不知道那些代码的意思,删减的代码中就有自动释放池,小桥现在不删减main函数中的代码看看:

如图所示,所谓自动释放池就是由@autoreleasepool关键字声明的一个代码段,在其中用autorelease给对象发送消息就会把对象放个这个自动释放池中,当程序执行完自动释放池,释放池销毁,接着池中的每个对象都会收到一条release消息,使得各自的引用计数器减1。由于池中的对象只能在池过期时才能release,所以autorelease不能精确的回收一个对象,而是往往即使对象过期了,池中还有许多代码执行完,池过期了,全部对象才能release或回收。

三、autorelease的使用

小桥为了复习知识,依然要在这里用一用autorelease,所用到的全部代码为:

//
//  文件:Person.h
//  项目:博客笔记
//  作者:葬花 桥
//  日期:14-5-10
//  版权:  Copyright (c) 2014年 itcast. All rights reserved.
//
#import <Foundation/Foundation.h>

@interface Person : NSObject

@property (nonatomic,retain) NSString *name;
@property (nonatomic,assign) int age;

@end
//
//  文件:Person.m
//  项目:博客笔记
//  作者:葬花 桥
//  日期:14-5-10
//  版权:  Copyright (c) 2014年 itcast. All rights reserved.
//
#import "Person.h"

@implementation Person

- (void)dealloc
{
    NSLog(@"%@--被回收了!", _name);
    [super dealloc];
}

@end
//
//  main.m
//  autorelease与自动释放池
//
//  Created by 葬花 桥 on 14-5-10.
//  Copyright (c) 2014年 itcast. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "Person.h"

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

    @autoreleasepool  // 自动释放池
    {
        Person *p = [[[Person alloc] init] autorelease]; // 实例化Person类的对象
        p.age = 10; // 调用setAge:方法
        p.name = @"桥"; // 调用setName:方法
    } // 自动释放池过期时给p指向的对象发送release消息
    NSLog(@"main函数结束之前!");
    return 0;
}

如你看到的,小桥现在把创建对象和使用对象放在了@autorelease中,使用语句之后没有release,而是在创建对象的同时调用了autorelease方法,这同样也符合了内存管理原则1,谁alloc谁release或autorelease。使用了autorelease之后,我们不必再关心release要写在何处,我们只要保证,对对做操作在自动释放池中进行即可,在自动释放池销毁时,对象会自动收到release消息,而不必手动release。用下面的图附上佐证:

自动释放池可以嵌套使用,即在池中可以再生成一个池。

三、自动释放池的应用

自动释放池的应用还是比较多的,在上几篇的笔记中小桥没有提系统对象的内存管理,因为苹果官方已经写好了内存管理的代码封装在类中。比如NSString = @"小桥 ",字符串对象的内存管理封装在类内部,在外面就不用我们手动release。在这里小桥模拟一下它的封装过程,在Person声明部分声明一个类方法,方法名为
person(规范写法:类名但是第一个字母小字),这与C++的默认构造方法形式有一点相似但不同,在实现文件中实现这个方法

//
//  文件:Person.m
//  项目:博客笔记
//  作者:葬花 桥
//  日期:14-5-10
//  版权:  Copyright (c) 2014年 itcast. All rights reserved.
//
#import "Person.h"

@implementation Person

- (void)dealloc
{
    NSLog(@"%@--被回收了!", _name);
    [super dealloc];
}

// 类方法的实现
+ (id)person
{
    Person *p = [[[Person alloc] init] autorelease]; // 创建一个对象,并调用autorelease方法加到自动释放池

    return p; // 返回这个对象的地址
}

@end

以后用高用这个类方法就可以创建Person类的对象,而且不必再手动release前提是要在自动释放池中去使用。NSString也是类似的,直接放到自动释放池中使用

下面这张图可以间接证明:

---------------------- IOS开发Android培训、期待与您交流! ---------------------- 详细请查看:www.itheima.com

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

时间: 2024-10-03 04:20:55

黑马程序员-OC学习笔记之autorelease与自动释放池的相关文章

黑马程序员-OC学习笔记之ARC

---------------------- IOS开发.Android培训.期待与您交流! ----------------------一.什么是ARC        ARC是自动引用计数,苹果官方在Xcode4.2及以后版本中加入的一个内存管理机制,完全取代了程序员人工的内存管理,使得程序员只须关心程序本身.使用ARC,编译器会自动在代码中加入内存管理代码,是一个编译器特性,而不是运行时特性,当然,它也和JAVA的垃圾回收不同,它的本质和手动的内存管理是一样的,只是这些代码编译器会自动添加.

黑马程序员-OC学习笔记之Foundation框架NSNumber、NSValue和NSDate

---------------------- IOS开发.Android培训.期待与您交流! ---------------------- 一.NSNumber 前几篇笔记中,小桥复习了Foundatio框架中的几个类,这三个是OC学习的尾声了. 小桥已经复习过OC数组类NSArray,也说过它只能存放OC的对象,对于基本的数据类型确无能为力,但是实际编程中经常要把基本的数据如int.float,结构体存放的OC数组中,怎么办?这里的NSNumber就有用了,它能够把基本数据类型包装成OC对象.

黑马程序员-OC学习笔记之block

过山车 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 9426    Accepted Submission(s): 4151 Problem Description RPG girls今天和大家一起去游乐场玩,终于可以坐上梦寐以求的过山车了.可是,过山车的每一排只有两个座位,而且还有条不成文的规矩,就是每个女生必须找个个男生做par

黑马程序员-OC学习笔记之NSString与NSMutableString

---------------------- IOS开发.Android培训.期待与您交流! ---------------------- 一.NSString与NSMutableString 相信大家对NSString类都不陌生,它是OC中提供的字符串类,它的对象中的字符串都是不可变的,而它的子类NSMutableString类的对象中的字符串就是可变的.什么是可变与不可变呢?二者的区别就是在已经创建的一个字符串对象中,在程序中能不能更改字符串,比如拼接新的字符串,可变的可以在原字符串中更改,

黑马程序员——OC学习笔记—— Copy

黑马程序员——OC学习笔记—— Copy ------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- copy 即对象拷贝 要使用对象数据而不希望修改对象时,可以使用copy copy叫做浅拷贝  mutablecopy深拷贝 copy需要遵守NSCopying协议,实现CopywithZone方法 MutableCopy也一样要遵守相应协议 注意: OC中copy复制的对象都是不可变的  mutablecopy复制的是可变副本 浅拷贝:只拷贝地址,不

黑马程序员-OC学习笔记之Foundatio框架集合类

---------------------- IOS开发.Android培训.期待与您交流! ---------------------- 一.OC数组 OC数组是一个类,它也分不可变数组NSArray和可变数组NSMutableArray. 1?不可变数组的创建 // 创建一个不可变数组,元素为一个OC字符串对象 @"小桥" NSArray *array1 = [NSArray arrayWithObject:@"小桥"]; // 创建一个不可变数组,元素为多个O

黑马程序员_OC学习笔记之Foundation框架集合类

OC--集合类 1.OC集合类包括NSArray,NSSet,NSDictionary都是以面向对象的方式操作数组,而且OC数组不像C语言中的数组只能存放同一种数据类型,它可以存放任意类型的对象,但是不能存放非OC对象类型如基本数据类型int,struct,enum等 2.OC数组是以对象的方式存在,因此在创建的时候需要为创建的对象前面加* 3.NSArray数组一旦创建就决定了是不是可变,而且永远是可变或不可变 4.NSArray数组和子类NSMutableArray的基本操作: 1>使用NS

黑马程序员-C学习笔记之scanf

---------------------- IOS开发.Android培训.期待与您交流! ---------------------- 一.scanf函数介绍 这也是在stdio.h中声明的一个函数,因此使用前必须加入#include<stdio.h>.调用scanf函数时,需要传入变量的地址作为参数,scanf函数会等待标准输入设备(比如键盘)输入数据,并且将输入的数据赋值给地址对应的变量. 函数原型为:int scanf(const char*format,...); 二.scanf用

黑马程序员_OC学习笔记之description方法和sel

OC--description方法 1.Description方法包括类方法和对象方法.(NSObject类所包含) -description(对象方法) 2.使用NSLog和@%输出某个对象时,会调用对象的description方法,并拿到返回值进行输出. +description(类方法) 3.使用NSLog和@%输出某个对象时,会调用类对象的description方法,并拿到返回值进行输出,把整个对象一次性打印出来,打印对象使用%@. 4.使用@%打印对象如(“@%”,P)默认打印输出为<