关于内存管理/set/get方法
MRC状态下
1 任何继承NSObject的对象,存放于堆控件中,都需要手动管理内存 。
2 基本数据类型放到栈中,对象放到堆空间中,内存是有系统管理的。(int\float\enum\struct)
上句 Person *p = [[Person alloc] init];
上图:[p release];
Person 对象引用计数器为0,手动释放内存,对象被系统回收。
此时:
僵尸对象:当前Person对象成为僵尸对象(对象的内存空间被系统回收,且无法再继续使用)
野指针:指针p被成为野指针(指向僵尸对象的指针) 给野指针发送消息 会 报错
当 p = nil; p =0; p = NULL;
空指针 此时的p 为空指针(没指向任何东西的指针) 给空指针发送消息 不会 报错
检测僵尸对象( 僵尸对象检测 stop右-》Edit Scheme-》Diagncatics-》 Objective-C-》勾选Enable zomble objects)
Set方法的内存管理
set方法的内存管理分为两块
1 set方法中的 release旧值 retain新值
2 dealloc 的release 新值(呼应set方法中的retain新值)。
@property
在MRC状态下
1:例如 @property Book *book;
意义:实现了book的get set方法,生成了_book 且(set方法中无release旧值及retain新值操作仅仅是简单的赋值)
2:例如 @property(assign) int age;
意义:实现了book的get set方法,生成了_book 且(set方法中无release旧值及retain新值操作仅仅是简单的赋值),其实不写assign也可以,即为直接赋值。
3:例如 @property(retain) Book *book;
意义:实现了book的get set方法,生成了_book 且(set方法中生成了release旧值及retain新值操作,内存管理代码生成)但是dealloc中的新值release仍需手动释放。
4:例如 @property(copy) Book *book;
意义:实现了book的get set方法,生成了_book 且(set方法中生成了release旧值及retain新值操作,内存管理代码生成)但是dealloc中的新值release仍需手动释放 雷同retain
5:例如 @property(readonly/readwrite)Book *book;
意义:前者 生成book的get方法 生成_book, 后者实现了book的get set方法,生成了_book
6:蛋疼的改名 给变set、get方法名
//重命名 set方法setTest方法名更改为setAbc get方法test更改为bcd 仅仅是改名字 生成的_test变量不变 @property (nonatomic, assign,setter= setAbc:,getter = bcd) int test;-------M -------- //1 如果同时重写了 set get方法则_test变量消失。。。已测试 //1 如果直重写了 set get方法其中之一 _test不变 -(void)setAbc:(int)test {_test = test;} //- (int)bcd //{ // return _test; //}
PS:所以MRC中,property需要配合dealloc使用
//property 变量 意味着:生成带下划线的成员变量,自动生成setter/getter方法.
//Setter方法是直接赋值(无release旧值 retain新值操作)
//getter方法是返回
//如果两个方法你都手动实现(重写set/get),意味着覆盖原来生成的get/set方法 及下划线成员变量(已测试)。
//如果只实现get/set其中的一个方法,剩下的原方法不会被覆盖还是会生成带下划线的成员变量,
//@property(retain) Book *book;
参数retain:意味着 release旧值 retain新值
被retain的对象,一定要在dealloc中release下
//@property(assign) int age;
参数assign:意味着 直接赋值(默认就是直接赋值)
//@property(copy) Book *book;
参数copy:意味着 release旧值 retain新值
//@property(readonly/readwrite)
只生成get方法/set方法
PS:所以MRC中,property需要配合dealloc使用
---------单个对象的内存管理---------
每个对象给引用计数器分配四个字节的存储空间,当对象的引用计数器为零时,系统自动回收对象
对象 retain 计数器加1
对象 alloc retain copy 引用计数器加1
dealloc 对象被销毁,系统会自动给对象发送一条dealloc方法
dealloc里面写东西一定最后调用[super dealloc];
ios的main函数是个死循环
---------多个对象之间的内存管理---------
oc对象管理内存
内存管理
1 任何继承NSObject的对象,都需要管理内存
2 基本数据类型放到栈中,对象放到堆空间中
3 oc对象 nil指针 release 不报错
4 僵尸对象检测 stop右-》Edit Scheme-》Diagncatics-》 Objective-C-》勾选Enable zomble objects
---------单个对象的内存管理---------
每个对象给引用计数器分配四个字节的存储空间,当对象的引用计数器为零时,系统自动回收对象
对象 retain 计数器加1
对象 alloc retain copy 引用计数器加1
dealloc 对象被销毁,系统会自动给对象发送一条dealloc方法
dealloc里面写东西一定最后调用[super dealloc];
ios的main函数是个死循环
---------多个对象之间的内存管理---------
oc对象管理内存
1 Set方法:将传进来的对象,给类的_成员变量,赋值。
2 Get方法:返回_成员变量.
3 关于set方法的内存管理流程(以人书为例):
set方法,将传进来的book给_book赋值,先要对book 做一次retain计数器加一
_book=[book retain];
person类被销毁时,会调用dealloc方法,所有在这里要对_book最一次release,
4 set方法的标准写法(非常重要)
- (void)setCar:(Car *)car
{
if (car!=_car) { // 1
[_car release];// 2
_car=[car retain]; // 3
}
}
注释:set方法,提供方法以便修改一个类下划线成员变量的值,
1 正常情况下,只修改一次成员变量的值,只写3即可(将传入的对象retain下在赋值),
2 如果再次修改成员变量值,则需要对之前传入的对象做一次release,即当前对象_car。
3 为了严谨,需加判断,现在传入的对象非当前对象。
5 - (Car *)car
{
return car;
}
6 - (void)dealloc
{
// 1:对当前所拥有的所有对象做一次relase方法
[_car release];
[super dealloc];
}
在MRC中 4,5,6是setter getter的标准写法
// 2:最后调用
//循环引用
@class:仅仅告诉编译器这是一个类.就可以引用一个类
一方包含头文件 把两边头文件中的#import换成@class即可
实现文件中#import.
//解决循环引用问题:
两端 一边用@property(retain) dealloc继续release
一边用@property(assign) dealloc无需release
//autorelease
//@autoreleasepool
当对象 调用autorelease方法时,系统会将对象放到释放池中,对对象的计数器无任何影响
//@autoreleasepool PS:ios5.0之后的
//在ios5.0之前 需要创建一个自动释放池对象,在销毁!~
@autoreleasepool
{//开启释放池
}
//结束释放池(池中所有对象做一次release操作)
自动释放池是存在系统的栈中的(这和局部变量的栈不是一个),栈的特点是先进后出
自动释放池是存在系统的栈中的(这和局部变量的栈不是一个),栈的特点是先进后出
参考资料:http://www.cnblogs.com/appzhang/p/3588169.html
http://blog.csdn.net/q199109106q/article/details/8565017
转载于:https://www.cnblogs.com/ly1973/p/3705731.html
关于内存管理/set/get方法相关推荐
- linux内存管理的主要概念是虚拟内存,你知道linux内存管理基础及方法?
描述 一.基本概念 (1)物理内存和虚拟内存 物理内存:系统硬件提供的真实物理内存 虚拟内存:利用磁盘空间虚拟出的一块逻辑内存,用作虚拟内存的磁盘空间被称为swap,swap类似于windows的虚拟 ...
- Objective-C 内存管理之dealloc方法中变量释放处理
本文转载至 http://blog.sina.com.cn/s/blog_a843a8850101ds8j.html (一).关于nil http://cocoadevcentral.com/d/le ...
- Android内存管理-OnTrimMemory
Application中有两个与内存管理相关的方法:onLowMemory()和 onTrimMemory(int level),源码如下 1 @CallSuper 2 public void onL ...
- STM32 内存管理实验
参考原文<STM32F1开发指南> 内存管理简介 内存管理,是指软件运行时对计算机内存资源的分配和使用的技术.最主要的目的是如何高效.快速的分配,并且在适当的时候释放和回收内存资源.内存管 ...
- nginx源码分析—内存池结构ngx_pool_t及内存管理
本博客( http://blog.csdn.net/livelylittlefish)贴出作者(阿波)相关研究.学习内容所做的笔记,欢迎广大朋友指正! Content 0.序 1.内存池结构 1.1 ...
- nginx源码分析—内存池结构ngx_pool_t及内存管理(精辟)
Content 0.序 1.内存池结构 1.1 ngx_pool_t结构 1.2其他相关结构 1.3 ngx_pool_t的逻辑结构 2.内存池操作 2.1创建内存池 2.2销毁内存池 2.3重置内存 ...
- 【精华】详解Qt中的内存管理机制
前言 内存管理,是对软件中内存资源的分配与释放进行有效管理的方法和理论. 众所周知,内存管理是软件开发的一个重要的内容.软件规模越大,内存管理可能出现的问题越多.如果像C语言一样手动地管理内存,一会给 ...
- memset 结构体内指针_数据结构之线性表应用——内存管理
大家好,我是隔壁小王,前面我给大家讲了数据结构中的线性表,因为是第一次写作,可能很多地方描述得不清楚,真是惭愧至极啊!这两天我花了不少时间来学习如何写作,也看了不少公众号文章,今天我来讲讲线性表的应用 ...
- iOS内存管理的知识梳理
从作用上来说,手机内存小,划分给每个App的内存有限,合理的进行内存管理,有利于提高软件的运行性能和用户体验: 另外,内存管理是一大理论知识块,对这块知识的理解程度也是考核面试者的重要标准. 内存管理 ...
最新文章
- 树和二叉树(四种遍历,建树)详解+二叉排序树(包含图像和相关习题)
- 开源医学图像数据集(资源整合)
- 实验12:引用外部属性文件★(spring管理连接池);
- Oracle with语句的用法
- enterprise architect复制到word中的标签怎么改变_7个 Word 技巧,不会别说自己会 Word...
- 李洋疯狂C语言之求素数的方法
- 66元机票盲盒,去哪随机、日期随机:要不起!
- Docker带版本号安装Zk
- cpu过剩是什么意思_现在为什么人们都说CPU性能过剩,而不说显卡性能过剩?
- 使用Laravel和Vue.js2.5进行服务器端渲染
- 恭喜本月拍牌中标了-上海!
- 大学生静态HTML网页源码 我的校园网页设计成品 学校班级网页制作模板 web课程设计 dreamweaver网页作业
- IDEA连接mysql后,schemas中无表格
- 华为android9.1.0怎么隐藏应用,华为畅享10s怎么隐藏应用 可以设置应用锁和隐私空间...
- 随机森林(Random Forest)算法原理
- 抖音企业号有什么好处?
- WinMail邮件服务器(客户端)环境搭建与配置
- 如何查看office是否永久激活?
- 丰巢后撤,便宜了菜鸟驿站、京东快递柜?
- MMdetection3d环境搭建、使用MMdetection3d做3D目标检测训练自己的数据集、测试、可视化,以及常见的错误
热门文章
- 几个解决 Maven Jar 包冲突的小技巧,太实用了!
- 面试:一个 Java 字符串到底有多少个字符?
- 为什么 Kafka 速度那么快?
- Istio,灰度发布从未如此轻松!!!
- 演化:这五年里,我们对架构师职责的思考与定位
- Intellij Idea非常6的10个姿势!
- jQuery-层次选择器的学习
- hibernate 向数据库里设置了默认值的字段添加数据为null时失效的问题
- oracle修改字段名称 试图删除被依赖列_oracle 添加 删除列 修改表名字 ;加注释 异常解释...
- notepad 没有plugin manager_自学英语的几个网站(免费网站)?性价比高的机构有没有?...