OC学习篇之---数组对象的引用计数问题和自动释放池的概念
之前一片文章中我们介绍了OC中的两个关键字@property和@synthesize的使用的使用:
http://blog.csdn.net/jiangwei0910410003/article/details/41925967
今天我们来看一下OC中数组对象在是如何处理对象元素的引用计数问题的,同时介绍一下自动释放池的相关概念
一、数组对象是如何处理对象元素的引用计数问题
//
// main.m
// 26_NSArrayMemeryManager
//
// Created by jiangwei on 14-10-12.
// Copyright (c) 2014年 jiangwei. All rights reserved.
// #import <Foundation/Foundation.h> #import "Dog.h" int main(int argc, const char * 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 jiangwei on 14-10-13.
// Copyright (c) 2014年 jiangwei. All rights reserved.
// #import <Foundation/Foundation.h> #import "Dog.h" int main(int argc, const char * 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];
这行代码就相当于系统自动释放池的 }
这样就好理解了吧
总结
这一篇文章主要介绍了OC中数组对象操作元素对象的时候需要处理的引用问题,以及我们可以自定义一个自动释放池,这种方式比系统提供的自动释放池方便,可操作性强。
OC学习篇之---数组对象的引用计数问题和自动释放池的概念的更多相关文章
- OC_内存管理(二)对象复制、循环引用问题、自动释放池
循环调用: 1.循环引用的问题 两个对象A.B,有可能会出现特殊情况:A中包含B的实例变量:B中也包含A的实例变量,如果这两个实例变量都是强引用(A有着B的实例变量所有权,B也有A的实例变量所有权 ...
- OC学习篇之---总结和学习目录
今天终于把OC的基础知识学习完了,但是这些知识只是最基础的,还有很多高级知识,这个可能需要后面慢慢的去学习才能体会到.下面就是这次学习OC的目录教程,如果大家发现有什么不正确的地方,请指正,小弟是新生 ...
- OC学习篇之---循环引用问题
在之前的一片文章中,我们介绍了数组操作对象的时候引用问题以及自动释放池的概念: http://blog.csdn.net/jiangwei0910410003/article/details/4192 ...
- (转载)OC学习篇之---第一个程序HelloWorld
之前的一片文章简单的介绍了OC的相关概述,从这篇开始我们就开始学习OC的相关知识了,在学习之前,个人感觉需要了解的其他的两门语言:一个是C/C++,一个是面向对象的语言(当然C++就是面向对象,不过这 ...
- OC中对象元素的引用计数 自动释放池的相关概念
OC中数组对象在是如何处理对象元素的引用计数问题的,同时介绍一下自动释放池的相关概念 一.数组对象是如何处理对象元素的引用计数问题[objc] view plaincopy 1. // 2. / ...
- OC学习篇之---第一个程序HelloWorld
从这篇开始我们就开始学习OC的相关知识了,在学习之前,个人感觉需要了解的其他的两门语言:一个是C/C++,一个是面向对象的语言(当然C++就是面向对象,不过这里最好还是Java).在干活之前,得先找到 ...
- OC学习篇之---单例模式
在之前的一片文章中介绍了对象的拷贝相关知识:http://blog.csdn.net/jiangwei0910410003/article/details/41926531,今天我们来看一下OC中的单 ...
- OC学习5——类和对象
1.OC是在C语言基础上进行扩展得到的一门面向对象的程序设计语言,它也提供了定义类.成员变量和方法的基本功能.类可以被认为是一种自定义的数据类型,使用它可以定义变量,所有使用类定义的变量都是指针类型的 ...
- OC学习篇之---内存管理介绍和使用
在之前的一片文章我们说了OC中谓词操作:http://blog.csdn.net/jiangwei0910410003/article/details/41923507,从今天开始我们就来看一下OC中 ...
随机推荐
- CSS中的flex布局
1.flex 布局的概念 Flex是Flexible Box的缩写,意为"弹性布局",用来为盒状模型提供最大的灵活性.任何一个容器都可以指定为 Flex 布局,行内元素也可以通过 ...
- C++ string.replace的使用
//下面是一个检查一个字符串中是否有'.'的函数,该函数将找到的'.'转化为'_'. inline void checkName(string& name) { std::; while (s ...
- mysql的windows客户端链接远程全套案例
我是linux 的服务器,navicat12的客户端, 开始链接的时候需要开服务器上得对外爆漏端口 3306,方法: 添加指定需要开放的端口: firewall-cmd --add-port=/tcp ...
- 嵌入式开发环境搭建(一) 虚拟机实现桥接Ethernet网口 并且通过WIFI进行NAT联网
背景: 目前手头上有一块JZ2440的板子,之前有搭建完整套开发环境,由于虚拟机故障需要从新搭建服务器端,故在此记录搭建步骤 环境: Ubuntu16.4 VMWare 12 先行条件: 先按照自定义 ...
- 【转】 Linux 命令解释(Linux基础二)
前言 对服务器来讲,图形界面会占用更多的系统资源,而且会安装更多的服务.开放更多的端口,这对服务器的稳定性和安全性都有负面影响.其实,服务器是一个连显示器都没有的家伙,要图形界面干十么? 说到这里,有 ...
- Design:设计目录
ylbtech-Design:设计目录 1.返回顶部 1.0 蚂蚁设计 https://design.alipay.com 1.1 Ant Design - 一个 UI 设计语言 https://an ...
- selenium2-java 浏览器cookie的获取
//成功登陆后增加如下代码 File cookieFile = new File("C:\\tmp\\tangdai.cookie.txt"); ...
- 测开之路三十二:Flask基础之错误与重定向
错误处理,框架默认的错误为:not Found 可以捕获,并自定义 准备一张自定义图片,放在static文件夹下,并在template下创建一个html文件,引用该图片 捕获404状态,返回自定义页面 ...
- Python Django 编写一个简易的后台管理工具4-添加admin模版
导入admin后台模版 可以在网上任意搜索模版,我这里也提供一个地址github 拷贝admin后台的html文件至项目的templates文件夹 创建static文件夹,将admin后台的js,im ...
- 解决 ERROR 1044 (42000): Access denied for user ''@'localhost' to database 'mysql'
原文链接:https://blog.csdn.net/sea_snow/article/details/82498791 感谢原作者大大 提示:ERROR 1044 (42000): Access ...