内存管理和@property的属性
内存管理和@property的属性
目录
- 对内存管理的理解
- Objective C内存管理方式
- 内存的管理
对象的所有权和内存管理原则
合理解决内存管理带来的问题
自动释放池
- @property的属性
- ARC自动引用计数
对内存管理的理解
Objective C内存管理方式
MRC(Manual Reference Counting)手动引用计数——需要程序员手动管理内存
ARC(Automatic Reference Counting)自动引用计数——由系统自动管理内存(实质为编译预处理器给程序源码适当的位置添加引用计数增加和减少的代码)
设置方式
在Build Phase的Compile Sources中对应的文件更改其Compiler Flags
设置为MRC:-fno-objc-arc
设置为ARC:-fobjc-arc
内存的管理
对象的所有权和内存管理原则
一个对象和一个函数都可以拥有对类对象的管理权,因此对象和函数需要负责类对象的创建和释放
合理解决内存管理带来的问题(在MRC下,在dealloc上有对拥有对象做释放)
阶段一
MyClass *myClass = [[MyClass alloc] init];
//myClass的行为
[myClass release];
阶段二
-(void)setEngine:(Engine *)newEngine{ engine = newEngine; }
Car *car = [[Car alloc] init];
Engine *engine = [[Engine alloc] init]; //1
[car setEngine:engine]; //1
[engine release]; //0 致使car对象中的engine指向的对象为空
阶段三
对setter的调整:-(void)setEngine:(Engine *)newEngine{ engine = [newEngine retain]; };
存在问题:
Engine *engine1 = [Engine new]; //1
[car setEngine:engine1]; //2
[engine1 release]; //1
Engine *engine2 = [Engine new]; //1
[car setEngine:engine2]; //1
[car release]; //1 此时engine1没有被释放掉,即car原来指向的对象没有被释放
阶段三
继续对setter的调整:-(void)setEngine:(Engine *)newEngine{ [engine release]; engine = [newEngine retain]; }
存在问题
Engine *engine = [Engine new]; //1
Car *car1 = [Car new];
Car *car2 = [Car new];
[car1 setEngine: engine]; //2
[engine release]; //1
[car2 setEngine:[car1 engine]]; //出错 此时engine的引用计数为0,car1和car2都不能使用其engine属性
阶段四
继续对setter的调整:-(void)setEngine:(Engine *)newEngine{ [newEngine retain]; [engine release]; engine = newEngine; }
自动释放池
@property的属性
strong和weak
assign和retain
atomic和nonatomic
与线程安全有关
read、write、readonly、writeonly、readwrite
读写操作限制
copy
ARC自动引用计数
概述
ARC是LLVM编译器特性,项目中不再使用retain,release,autorelease,启动ARC之后,编译器会自动在合适的地方插入适当的retain,release,autorelease语句,ARC是编译器特性
指针保持对象的生命
ARC规则:只要还有一个变量指向对象,对象就会保持在内存中。当指针指向新值,或者指针不再存在时,相关联的对象就会自动释放。本规则对于实例变量、synthesize属性、本地变量都是适用的。
@property修饰符
strong:等同于“retain”,属性成为对象的拥有者,引用计数+1
weak:属性是weak pointer,当对象释放时会自动设置为nil,记住Outlet应该适用weak,引用计数不变
unsafe_unretained:等同于之前的“assign”,只有IOS 4才应该适用
copy:和之前的copy一样,复制一个对象并创建strong关联
assign:对象不能使用assign,但原始类型(BOOL、int、float)任然可以使用
运用
“父-子关系”
父亲拥有一个儿子的strong指针,但为了阻止所有权回环,儿子需要使用weak指针指向父亲,典型例子:delegate模式,View Controller通过strong指针拥有一个UITableView,Table view的data source和delegate都是weak指针,指向你的View Controller
问题代码分析
__weak NSString *str = [[NSString alloc] initWithFormat:...];
NSLog(@"%@",str);//will output "(null)"
Xcode警告:assigning retained object to weak variable;object will be released after assignment
ARC的限制
ARC只能工作于Objective C对象,如果应用使用了Core Foundation或者malloc()/free(),此时需要自己来管理内存
虽然ARC帮我们自动管理了内存,但因为strong指针会保持对象的生命,某些情况下你仍然需要手动设置这些指针为nil,否则可能导致应用内存不足
Xcode的ARC自动迁移
详细操作参见《IOS 5 ARC完全指南.pdf》
Blocks和ARC
Singleton与ARC
Autorelease和AutoreleasePool
Cocos2D和Box2D
内存管理和@property的属性的更多相关文章
- OC语法7——内存管理之@property参数
@property的参数: 我们已经知道为了给开发者提供便捷,OC提供了@porperty关键字,它可以自动生成属性的set和get方法. 但是我们又知道,在OC中还面临者对象内存管理的问题,而且我们 ...
- 七.OC基础加强--1.内存管理 2.野指针,内存泄露 3.set方法的内存管理 4.@property参数 5.@class和循环retain的使用 6.NSString的内存管理
1,内存管理简单介绍 1,为什么要有内存管理? malloc selloc dealloc```需要回头复习 一般的内存 4s 是512m内存:6 是1024m内存: 当内存过大时,会耗尽内存.出现程 ...
- ios 内存管理与property copy strong weak assign
- (void)fun{ NSString* str = [[NSString alloc] initWithString:@"string"]; NSLog(@"% ...
- iOS开发系列—Objective-C之内存管理
概述 我们知道在程序运行过程中要创建大量的对象,和其他高级语言类似,在ObjC中对象时存储在堆中的,系统并不会自动释放堆中的内存(注意基本类型是由系统自己管理的,放在栈上).如果一个对象创建并使用后没 ...
- iOS-旧项目中手动内存管理(MRC)转ARC
在ARC之前,iOS内存管理无论对资深级还是菜鸟级开发者来说都是一件很头疼的事.我参 加过几个使用手动内存管理的项目,印象最深刻的是一个地图类应用,由于应用本身就非常耗内存,当时为了解决内存泄露问题, ...
- iOS-OC内存管理
目标 1.[理解]内存管理 2.[掌握]第一个MRC程序 3.[掌握]内存管理的原则 4.[理解]野指针与僵尸对象 5.[理解]单个对象的内存管理 6.[理解]多个对象的内存管理 7.[掌握]set方 ...
- OC语言-05-OC语言-内存管理
一.引用计数器 1> 栈和堆 栈 ① 主要存储局部变量 ② 内存自动回收 堆 ① 主要存储需要动态分配内存的变量 ② 需要手动回收内存,是OC内存管理的对象 2> 简介 作用 ① 表示对象 ...
- OC - 5.内存管理
一.引用计数器 1> 栈和堆 栈 ① 主要存储局部变量 ② 内存自动回收 堆 ① 主要存储需要动态分配内存的变量 ② 需要手动回收内存,是OC内存管理的对象 2> 简介 作用 ① 表示对象 ...
- IOS中内存管理机制浅解
我们知道在程序运行过程中要创建大量的对象,和其他高级语言类似,在ObjC中对象时存储在堆中的,系统并不会自动释放堆中的内存(注意基本类型是 由系统自己管理的,放在栈上).如果一个对象创建并使用后没有得 ...
随机推荐
- Chapter7:类
关于this指针 成员函数通过一个名为this的额外的隐式参数来访问调用它的对象.当我们调用一个成员函数时,用请求该函数的对象初始化this. total.isbn(); //等价于编译器重写为 Sa ...
- xshell 上传 下载文件
借助XShell,使用linux命令sz可以很方便的将服务器上的文件下载到本地,使用rz命令则是把本地文件上传到服务器. sz用法: 下载一个文件 sz filename 下载多个文件 sz file ...
- Python面试必须要看的15个问题
本文由EarlGrey@编程派独家编译,转载请务必注明作者及出处. 原文:Sheena@codementor 译文:编程派 引言 想找一份Python开发工作吗?那你很可能得证明自己知道如何使用Pyt ...
- Flex通信-Java服务端通信实例
转自:http://blessht.iteye.com/blog/1132934Flex与Java通信的方式有很多种,比较常用的有以下方式: WebService:一种跨语言的在线服务,只要用特定语言 ...
- XML转换为Map通用算法实现 Java版本(Stax实现)
目前项目中需要将XML转换为Map,下面给出了自己的代码实现. 后续将为大家提供Dom版本的实现. 请各路大神给予各种优良实现. 场景: 在项目中需要解析XML文本字符串,需要将XML文本字符串映射为 ...
- RSS阅读器&BT sync
①RSS阅读器? 答:RSS阅读器是一种软件或是说一个程序,这种软件可以自由读取RSS和Atom两种规范格式的文档,且这种读取RSS和Atom文档的软件有多个版本,由不同的人或公司开发,有着不同的名字 ...
- 开源的c语言人工神经网络计算库 FANN
这年头机器学习非常的火,神经网络算是机器学习算法中的比较重要的一种.这段时间我也花了些功夫,学了点皮毛,顺便做点学习笔记. 介绍人工神经网络的基本理论的教科书很多.我正在看的是蒋宗礼教授写的<人 ...
- 使用 XMPP 构建一个基于 web 的通知工具——转
Inserting of file(使用 XMPP 构建一个基于 web 的通知工具.docx) failed. Please try again. http://www.ibm.com/develo ...
- MYSQL数据库性能调优之五:解决慢查询--存储引擎与数据类型
3.数据类型的影响 4.存储引擎的影响 看你的mysql现在已提供什么存储引擎:mysql> show engines; 看你的mysql当前默认的存储引擎:mysql> show var ...
- IP地址转换成Long型数字的算法
在应用程序开发中,涉及到IP地址的存储,大部分开发人员都将其存为String(或文本类型).能否将固定格式为m.n.x.y的IP地址转换成 Long型的数字呢?答案是肯定的.在数据库层面,可以直接将结 ...