内存管理和@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的属性的更多相关文章

  1. OC语法7——内存管理之@property参数

    @property的参数: 我们已经知道为了给开发者提供便捷,OC提供了@porperty关键字,它可以自动生成属性的set和get方法. 但是我们又知道,在OC中还面临者对象内存管理的问题,而且我们 ...

  2. 七.OC基础加强--1.内存管理 2.野指针,内存泄露 3.set方法的内存管理 4.@property参数 5.@class和循环retain的使用 6.NSString的内存管理

    1,内存管理简单介绍 1,为什么要有内存管理? malloc selloc dealloc```需要回头复习 一般的内存 4s 是512m内存:6 是1024m内存: 当内存过大时,会耗尽内存.出现程 ...

  3. ios 内存管理与property copy strong weak assign

    - (void)fun{  NSString* str = [[NSString alloc] initWithString:@"string"];  NSLog(@"% ...

  4. iOS开发系列—Objective-C之内存管理

    概述 我们知道在程序运行过程中要创建大量的对象,和其他高级语言类似,在ObjC中对象时存储在堆中的,系统并不会自动释放堆中的内存(注意基本类型是由系统自己管理的,放在栈上).如果一个对象创建并使用后没 ...

  5. iOS-旧项目中手动内存管理(MRC)转ARC

    在ARC之前,iOS内存管理无论对资深级还是菜鸟级开发者来说都是一件很头疼的事.我参 加过几个使用手动内存管理的项目,印象最深刻的是一个地图类应用,由于应用本身就非常耗内存,当时为了解决内存泄露问题, ...

  6. iOS-OC内存管理

    目标 1.[理解]内存管理 2.[掌握]第一个MRC程序 3.[掌握]内存管理的原则 4.[理解]野指针与僵尸对象 5.[理解]单个对象的内存管理 6.[理解]多个对象的内存管理 7.[掌握]set方 ...

  7. OC语言-05-OC语言-内存管理

    一.引用计数器 1> 栈和堆 栈 ① 主要存储局部变量 ② 内存自动回收 堆 ① 主要存储需要动态分配内存的变量 ② 需要手动回收内存,是OC内存管理的对象 2> 简介 作用 ① 表示对象 ...

  8. OC - 5.内存管理

    一.引用计数器 1> 栈和堆 栈 ① 主要存储局部变量 ② 内存自动回收 堆 ① 主要存储需要动态分配内存的变量 ② 需要手动回收内存,是OC内存管理的对象 2> 简介 作用 ① 表示对象 ...

  9. IOS中内存管理机制浅解

    我们知道在程序运行过程中要创建大量的对象,和其他高级语言类似,在ObjC中对象时存储在堆中的,系统并不会自动释放堆中的内存(注意基本类型是 由系统自己管理的,放在栈上).如果一个对象创建并使用后没有得 ...

随机推荐

  1. Swift相关图书推荐

    Swift与Cocoa框架开发 作      者 [澳] 曼宁(Jonathon Manning),巴特菲尔德-艾迪生(Paris Buttfield 出 版 社 人民邮电出版社 出版时间 2015- ...

  2. [LeetCode] Missing Number (A New Questions Added Today)

    Given an array containing n distinct numbers taken from 0, 1, 2, ..., n, find the one that is missin ...

  3. 记录一下ORACLE 10gR2的软件下载地址,备用。

    转载自:http://www.eygle.com/archives/2008/06/10gr2_download_link.html 记录一下ORACLE 10gR2的软件下载地址,备用. 下载OTN ...

  4. python堡垒机

    堡垒机 windows下安装python3的paramiko模块后一些报错总结: error: Unable to find vcvarsall.bat [官网对此问题的描述] : https://d ...

  5. UNIX环境下用C语言写静态库与动态库

    静态库,动态库用UNIX 的术语来说,或者叫做归档文件(archive 常以.a 结尾)和共享对象(share object 常以lib 开头.so 结尾)更为准确.静态库,动态库可能是WINDOWS ...

  6. 关于dom节点绑定滑动事件导致浏览器上下滑动失效解决方案--黄丕巧

    1.移动端开发往往需要添加一下自定义的左右滑动事件,但是添加了左右滑动事件之后就要阻止浏览器大默认事件,否则dom节点的滑动事件和浏览器本身的滑动会出现冲突,导致滑动的时候会出现消失瞬间再出现的效果 ...

  7. Codeforces Round #367 (Div. 2) B. Interesting drink (模拟)

    Interesting drink 题目链接: http://codeforces.com/contest/706/problem/B Description Vasiliy likes to res ...

  8. NLP初步

    [NLP初步] NLP是Natural Lanuage Process的缩写.搜索引擎可以通过关词匹配和完成很多的任务, 比如话题搜索(搜索包含律师, 法院, 控告等词的文档), 但是搜索引擎无法理解 ...

  9. (转载)ETL利器Kettle实战应用解析系列一【Kettle使用介绍】

    http://www.cnblogs.com/limengqiang/archive/2013/01/16/kettleapply1.html ETL利器Kettle实战应用解析系列一[Kettle使 ...

  10. hdu 5655 CA Loves Stick

    CA Loves Stick Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others) ...