版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、简单讲解Objective-C的基本特性及其内存管理方式这篇文章主要介绍了简单讲解Objective-C的基本特性及其内存管理方式,虽然Swift语言出现后iOS和Mac OS应用开发方面Objective-C正在成为过去时,但现有诸多项目仍然在使用,需要的朋友可以参考下一、OC简介Oc语言在c语言的基础上,增加了一层最小的面向对象语法,完全兼容C语言,在OC代码中,可以混用c,甚至是c+代码。可以使用OC开发mac osx平台和ios平台的应用程序。拓展名:c语言-.c OC语言.-m 兼容C+.-mm注:其实c语言和oc甚至任何一门语言都只是我们为了实现一些功能,达到一些效果而采用的工具,
2、抛开语法的差别外,我想最重要的应该是在解决问题的时候考虑的角度和方法不一样而已,然而这也构成了学习一门语言的重要性。二、语法预览(1)关键字基本上所有的关键字都是以开头的(为了与c语言的关键字区分开来),如interface implementation public等,少部分没有以开头,如id,_cmd等(2)字符串以开头C语言字符串:“hello”OC语言字符串:“hello”(3)其他语法基本类型:5种,增加了布尔类型Nil相当于是null,也就是0。屏幕输出:NSLog(“hello”);/自动换行NSLog(“age is %d”,2);三、OC程序开发过程#import预处理指令有
3、两个作用:(1)与#include一样,拷贝文件内容(2)可以自动防止文件的内容被重复拷贝程序编译连接过程:源文件(.m)-(编译)->目标文件(.0)-(链接)->可执行文件(.out)Foundation框架。如果要使用框架中的所有头文件那么应该怎么办?包含框架的主头文件。主头文件是一个框架中最主要的头文件,每个框架的主头文件名和框架名一致。如#import<foundation/foundation.h>运行过程如下:(1)编写OC源文件 .m .c(2)编译文件 cc -c xx.m xxx.c(3)链接 cc xx.o xxx.o -framework Fou
4、ndation(4)运行 ./a.out四、类型补充复制代码 代码如下:Int main()BOOL b=YES;BOOL b1=NO;BOOL b2=1;/ YESBOOL b3=2;/ NONSLog(“%i”,b);BOOL类型与其他类型的用法一致,BOOL类型的本质是char类型的,定义如下:复制代码 代码如下:Typedef signed char BOOL宏定义:复制代码 代码如下:#define YES (BOOL)1#define NO (BOOL)0布尔类型的输出一般当做整数来用。五、内存管理1、基本原理(1)为什么要进行内存管理。由于移动设备的内存极其有限,所以每个APP所
5、占的内存也是有限制的,当app所占用的内存较多时,系统就会发出内存警告,这时需要回收一些不需要再继续使用的内存空间,比如回收一些不再使用的对象和变量等。管理范围:任何继承NSObject的对象,对其他的基本数据类型无效。本质原因是因为对象和其他数据类型在系统中的存储空间不一样,其它局部变量主要存放于栈中,而对象存储于堆中,当代码块结束时这个代码块中涉及的所有局部变量会被回收,指向对象的指针也被回收,此时对象已经没有指针指向,但依然存在于内存中,造成内存泄露。(2)对象的基本结构每个OC对象都有自己的引用计数器,是一个整数表示对象被引用的次数,即现在有多少东西在使用这个对象。对象刚被创建时,默认
6、计数器值为1,当计数器的值变为0时,则对象销毁。在每个OC对象内部,都专门有4个字节的存储空间来存储引用计数器。(3)引用计数器的作用判断对象要不要回收的唯一依据就是计数器是否为0,若不为0则存在。(4)操作给对象发送消息,进行相应的计数器操作。Retain消息:使计数器+1,改方法返回对象本身Release消息:使计数器-1(并不代表释放对象)retainCount消息:获得对象当前的引用计数器值(5) 对象的销毁当一个对象的引用计数器为0时,那么它将被销毁,其占用的内存被系统回收。当对象被销毁时,系统会自动向对象发送一条dealloc消息,一般会重写dealloc方法,在这里释放相关的资源
7、,dealloc就像是对象的“临终遗言”。一旦重写了dealloc方法就必须调用super dealloc,并且放在代码块的最后调用(不能直接调用dealloc方法)。一旦对象被回收了,那么他所占据的存储空间就不再可用,坚持使用会导致程序崩溃(野指针错误)。2、相关概念和使用注意野指针错误:访问了一块坏的内存(已经被回收的,不可用的内存)。僵尸对象:所占内存已经被回收的对象,僵尸对象不能再被使用。(打开僵尸对象检测)空指针:没有指向任何东西的指针(存储的东西是0,null,nil),给空指针发送消息不会报错注意:不能使用p retaion让僵尸对象起死复生。3、内存管理原则(1)原则只要还有人
8、在使用某个对象,那么这个对象就不会被回收;只要你想使用这个对象,那么就应该让这个对象的引用计数器+1;当你不想使用这个对象时,应该让对象的引用计数器-1;(2)谁创建,谁release(a)如果你通过alloc,new,copy来创建了一个对象,那么你就必须调用release或者autorelease方法(b)不是你创建的就不用你去负责(3)谁retain,谁release只要你调用了retain,无论这个对象时如何生成的,你都要调用release(4)总结有始有终,有加就应该有减。曾经让某个对象计数器加1,就应该让其在最后-1.4、内存管理代码规范(1)只要调用了alloc,就必须有rele
9、ase(autorelease)(2)Set方法的代码规范(a)基本数据类型:直接复制复制代码 代码如下:-(void)setAge:(int)age_age=age;(b)OC对象类型复制代码 代码如下:-(void)setCar:(Car *)car/1.先判断是不是新传进来的对象If(car!=_car)/2 对旧对象做一次release_car release;/若没有旧对象,则没有影响/3.对新对象做一次retain_car=car retain;(3)dealloc方法的代码规范(a)一定要super dealloc,而且要放到最后(b)对self(当前)所拥有的的其他对象做一次r
10、elease操作-(void)dealloc_car release;super dealloc;5、property的参数(1)内存管理相关参数Retain:对对象release旧值,retain新值(适用于OC对象类型)Assign:直接赋值(默认,适用于非oc对象类型)Copy:release旧值,copy新值(2)是否要生成set方法(若为只读属性,则不生成)Readonly:只读,只会生成getter的声明和实现Readwrite:默认的,同时生成setter和getter的声明和实现(3)多线程管理(苹果在一定程度上屏蔽了多线程操作)Nonatomic:高性能,一般使用这个Atom
11、ic:低性能(4)Set和get方法的名称修改set和get方法的名称,主要用于布尔类型。因为返回布尔类型的方法名一般以is开头,修改名称一般用在布尔类型中的getter。复制代码 代码如下:propery(setter=setAbc,getter=isRich) BOOL rich;BOOL b=p.isRich;/ 调用6、内存管理中的循环引用问题以及解决案例:每个人有一张身份证,每张身份证对应一个人,不能使用#import的方式相互包含,这就形成了循环引用。新的关键字:class 类名;解决循环引用问题,提高性能class仅仅告诉编译器,在进行编译的时候把后面的名字作为一个类来处理。(1
12、)class的作用:声明一个类,告诉编译器某个名称是一个类(2)开发中引用一个类的规范(a)在.h文件中使用class来声明类(b)在.m文件中真正要使用到的时候,使用#import来包含类中的所有东西(3)两端循环引用的解决方法一端使用retain,一端使用assign(使用assign的在dealloc中也不用再release)7、Autorelease(1)基本用法(1)会将对象放到一个自动释放池中(2)当自动释放池被销毁时,会对池子里的所有对象做一次release(3)会返回对象本身(4)调用完autorelease方法后,对象的计数器不受影响(销毁时影响)(2)好处(1)不需要再关心
13、对象释放的时间(2)不需要再关心什么时候调用release(3)使用注意(a)占用内存较大的对象,不要随便使用autorelease,应该使用release来精确控制(b)占用内存较小的对象使用autorelease,没有太大的影响(4)错误写法(a)连续调用多次autorelease,释放池销毁时执行两次release(-1吗?)(b)Alloc之后调用了autorelease,之后又调用了release。(5)自动释放池(a)在ios程序运行过程中,会创建无数个池子,这些池子都是以栈结构(先进后出)存在的。(b)当一个对象调用autorelease时,会将这个对象放到位于栈顶的释放池中(6
14、)自动释放池的创建方式(a)ios 5.0以前的创建方式复制代码 代码如下:NSAutoreleasePool *pool=NSAutoreleasePool alloc init;pool release;/pool drain;用于mac (b)Ios5.0以后复制代码 代码如下:leasepool/开始代表创建自动释放池·······/结束代表销毁自动释放池(7)Autorelease注意(a)系统自带的方法中,如果不包含alloc new copy等,则这些方法返回的对象都是autorelease的,如NSDate
15、date;(b)开发中经常会写一些类方法来快速创建一个autorelease对象,创建对象时不要直接使用类名,而是使用self8、ARC内存管理机制(1)ARC的判断准则:只要没有强指针指向对象,对象就会被释放。(2)指针分类:(a)强指针:默认的情况下,所有的指针都是强指针,关键字strong(b)弱指针:_ _weak关键字修饰的指针声明一个弱指针如下:复制代码 代码如下:_ _weak Person *p;ARC中,只要弱指针指向的对象不在了,就直接把弱指针做清空操作。复制代码 代码如下:_ _weak Person *p=Person alloc init;/不合理,对象一创建出来就被释放掉,对象释放掉后,ARC把指针自动清零。ARC中在property处不再使用retain,而是使用strong,在dealloc中不需要再super dealloc。property(nonatomic,strong)Dog *dog;/ 意味着生成的成员变量_dog是一个强指针,相当于以前的retain。如果换成是弱指针,则换成weak,不需要加_ _。(3)ARC的特点总结:(a)不允许调用release,retain,retainCount(b)不允许重写dealloc,但是不允许调用super dealloc(c)property的参数:Strong:相当于原来的ret
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 会计主管税务筹划能力考核表
- 供应商管理标准更新通知6篇
- 快消品销售经理渠道拓展与销售额增长绩效评定表
- 产品库存调拨计划通知(6篇)范文
- 部门KPI指标绩效考核表
- 旅游产品经理旅游线路策划与执行力绩效衡量表
- 预防传染病患,守护快乐学习几年级主题班会课件
- 美容院店长客户回头率KPI考核表
- 小学主题班会课件:成长与学习
- 质量保障部门质量考核表
- 曹文轩泥鳅课件
- 一河一策合同范本
- TCCES45-2024增压式真空预压加固软土地基技术规程
- 标准化生产作业指导书及操作流程模板
- 不合理检查检验项目或组包常见问题清单(第二批)
- 餐饮店员工消防安全教育培训记录模板
- 员工绩效考核细则及评分标准
- TCDHA504-2021长输供热热水管网技术标准
- 焚烧车间安全培训
- 建筑工程电气施工质量验收规范
- 施工现场每日工作汇报
评论
0/150
提交评论