关于内存管理/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
关于内存管理/set/get方法的更多相关文章
- OC:内存管理、dealloc方法、copy知识点
属性的声明:使⽤@property声明属性 例如:@property NSString *name: 相当于@interface中声明了两个⽅法(setter.getter): 属性的实现:使⽤@s ...
- objective C 内存管理及属性方法具体解释
oc为每一个对象提供一个内部计数器.这个计数器跟踪对象的引用计数,当对象被创建或拷贝时.引用计数为1.每次保持对象时,调用retain接口.引用计数加1.假设不需要这个对象时调用release,引用计 ...
- iOS 非ARC基本内存管理系列 5-autorelease方法使用总结
autorelase:可以将对象交给自动释放池中,释放池销毁的时候对里面的对象做一次release操作代码如下 @autoreleasepool { Person *person = [[[Perso ...
- Objective-C 内存管理之dealloc方法中变量释放处理
本文转载至 http://blog.sina.com.cn/s/blog_a843a8850101ds8j.html (一).关于nil http://cocoadevcentral.com/d/ ...
- 【原创】Android内存管理-OnTrimMemory
Application中有两个与内存管理相关的方法:onLowMemory()和 onTrimMemory(int level),源码如下 @CallSuper public void onLowMe ...
- JVM的生命周期、体系结构、内存管理和垃圾回收机制
一.JVM的生命周期 JVM实例:一个独立运行的java程序,是进程级别 JVM执行引擎:用户运行程序的线程,是JVM实例的一部分 JVM实例的诞生 当启动一个java程序时.一个JVM实例就诞生了, ...
- OC语言-05-OC语言-内存管理
一.引用计数器 1> 栈和堆 栈 ① 主要存储局部变量 ② 内存自动回收 堆 ① 主要存储需要动态分配内存的变量 ② 需要手动回收内存,是OC内存管理的对象 2> 简介 作用 ① 表示对象 ...
- IOS基础之 (十一) 内存管理 ARC
一 内存管理 1. set 方法内存管理的相关参数 retain: release旧值,retain新值(值适用于OC对象) assign:直接赋值(set方法默认,适用于非OC对象类型,即基本数据类 ...
- 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 ...
随机推荐
- 9.4用WebApi去连接外部认证服务
原文链接:http://www.asp.net/web-api/overview/security/external-authentication-services VS2013和Asp.Net4.5 ...
- python 函数的文档字符串 docstrings
函数体的第一行可以是一个可选的字符串文本:此字符串是该函数的文档字符串,或称为docstring.(更多关于 docstrings 的内容可以在 文档字符串一节中找到.)有工具使用 docstring ...
- 编码(Code)
很遗憾,直接搜索Code或者编码是很难得找到这本书的,我也是无意中才接触到本书. 第一次读本书,对各方面的知识都不算很懂,觉得很多地方都写的太多浅显,好像本该就是这样子,一个编码系统说的那么麻烦干嘛, ...
- Codeforces Gym 100114 J. Computer Network
Description 给出一个图,求添加一条边使得添加后的图的桥(割边)最少. Sol Tarjan. 一遍Tarjan求割边. 我们发现连接的两个点一定是这两个点之间的路径上的桥最多,然后就可以贪 ...
- 修改vb程序图标
1. 2.
- 有向图寻找(一个)奇环 -- find an oddcycle in directed graph
/// the original blog is http://www.cnblogs.com/tmzbot/p/5579020.html , automatic crawling without l ...
- ubuntu安装文件比较工具Meld
Meld是一款可视化的文件及目录对比(diff) / 合并 (merge) 工具,通过它你可以对两个或三个文件/目录进行对比,并以图形化的方式显示出它们的不同之处,同时还提供编辑及合并功能,另外还支持 ...
- MVC Return View() 和 Return PartialView()的区别
分部视图在action中返回一定要用PartialView(),而不要偷懒使用View(),因为,如果你使用View()渲染视图,系统会认为你是一个标准视图,会为你加个默认的母板页(Layout),除 ...
- pip安装简单方法
前提:有网络 wget -c --no-check-certificate https://bootstrap.pypa.io/get-pip.py python get-pip.py
- iso网络各层协议
(1)网卡的作用就是把数据进行串并转换(串连数据是比特流形式的,存在与本计算机内部,而计算机与计算机之间是通过帧形式的数据来进行数据传输的),MAC子层规定了如何在物理线路上传输的frame,LLC的 ...