黑马程序员—— OC加强---ARC+Category+Block
2015-12-06 14:20
246 查看
——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——
第一讲 什么是ARC?
首先我们应该了解什么是底层机制:大家是否知道从旧时代的MRC到ARC机制到底意味着什么呢? 为什么ARC从开发速度,到执行速度和稳定性都要优于MRC?开发速度不言而喻,你少写很多release代码,甚至很少去操心这部分。执行速度呢?这个还要从runtime说起,还记得我在第2点说得一句话么:“Runtime is everything between your each function call.”MRC是一个古老的内存管理哲学,谁分配谁释放。通过counting来计数到底该资源有几个使用者。道理很简单,但是往往简单的东西人却会犯错。从来没有一个程序员可以充满信心的说,我写得代码从来没有过内存泄露。这样来看,我们就更需要让程序可以自己处理这个管理机制,这就需要把这个机制放到runtime里。
所以MRC->ARC就是把内存管理部分从普通开发者的函数中移到了函数外的runtime中。因为runtime的开发原型简单,逻辑层次更高,所以做这个开发和管理出错的概率更小。实际上编译器开发人员对这部分经过无数次测试,所以可以说用ARC几乎不会出错。另外由于编译的额外优化,使得这个部分比程序员自己写得代码要快速很多。而且对于一些通用的开发模式,例如autorelease对象,ARC有更优秀的算法保证autoreleasepool里的对象更少。RC是什么,r-Reference参照,引用 c-counting计数, RC就是引用计数。俗话说就是记录使用者的数量。 例如现在我有一个房间空着,大家可以进去随意使用,但是你进门前,需要给门口的计数牌子+1,出门时候-1。 这时候这个门口的牌子就是该房间里的人数。一但这个牌子变为0我就可以把房间关闭。这个规则可以让NSObject决定是不是要释放内存。当一个对象alloc时候,系统分配其一块内存并且object自动计数retainCount=1 这时候每当[object retain]一次retainCount+1(这里虽然简写也是rc不过是巧合或者当时开发人员故意选的retain这个词吧)每次[object release]时候retainCount-1 当retainCount==0时候object就真正把这快内存还给系统。
第二讲 ARC下的概念和原理
一 基本概念
1.ARC是编译器的特性,不是java的自动回收
2.创建工程时,勾选Automic Reference Counting即可
3.使用ARC时,对象将不能调用releas,retain,retaincount方法
4.允许重写dealloc但不能[super dealloc]
第三讲 基本原理
1.只要没有强指针指向对象,该对象就会被销毁,释放对象,也就是说如果一开始只有弱指针指向对象,那么是无意义的,一开始就会被回收。
2.指针默认都是强指针,修饰符;__strong:连续两个下划线,相当于原来的retain,只适用于OC对象
3.弱指针:__weak,弱指针是没法决定对象的内存是否被回收,只有强指针可以决定。相当于原来的assign,只适用于OC对象
弱指针指向的对象如果被回收了,弱指针本身也会被自动置空,避免野指针问题
4.assign还是适用于基本数据类型
实例代码:
}
四 把手动代码管理的旧工程,自动转换为ARC下的工程代码
点击XCode: edit -> refactor -> convert to oc ARC
第四讲 ARC使用的特点以及注意事项
1 不允许调用release,retain ,retaincount
2 允许重写dealloc,但是不允许调用[super dealloc]
3 @property的参数:
strong: 强指针 相当于retain
weak: 弱指针 相当于assign
assign: 基础类型,非oc对象
注意事项:只要是弱指针对象不存在,就直接把弱指针做清空(赋值为nil)
ARC中在property 处不再使用retain,而是使用strong,在dealloc中不需要在[super dealloc];
第五讲 分类(Category)的概念和使用流程
作用:Category在步修改原有类的基础上增加新的方法
一个庞大的类可以分模块开发,可以由多个人来编写,更有利于团队合作
使用分类的目的:1对现有类的拓展 2 作为子类的替代手段 3对类中方法归类
使用分类的步骤:
先申明分类->实现分类 ->使用分类,直接看一个分类的申明和实现的代码:
使用步骤:
1 此处申明一个类
@interface Person:NSObject
@end
2 申明一个分类
格式:
@interface 待拓展的类名(分类的名称)
@end
Person+base –>分类文件的命名规则
如:
@interface Person(base)
- (void) eat;
- (void) run;
@end
2 实现这个分类
格式:
@implementation 待拓展的类(分类的名称)
@end
3使用分类的方法:和使用类中原有对象一样
实例:
新建一个objectiveC.file文件 File:playGame FileType:Category Class:Person
第六讲 block的用法
1 block的基本概念
它除了有可执行代码以外,还包含了与堆,栈内存绑定的变量。因此,block对象包含一组状态数据,这些数据在程序执行时用于对行为产生的影响。
你可以用block来写一些可以传到api中的函数语句,可选择性的存储,并可以使用多线程,作为一个回调,block非常有用,因为它既包含回调期间执行的代码,又包含执行期间需要的数据。
它是c语言就有了不是oc中独有的!!!
2 block的基本用法
用^操作符来申明一个block变量,并指明block语句的开始。主体部分包含在{}中,int(^myBlock)(int)=^(int num){return num*num;}
block最简单的形式:
定义格式:
void
第一讲 什么是ARC?
首先我们应该了解什么是底层机制:大家是否知道从旧时代的MRC到ARC机制到底意味着什么呢? 为什么ARC从开发速度,到执行速度和稳定性都要优于MRC?开发速度不言而喻,你少写很多release代码,甚至很少去操心这部分。执行速度呢?这个还要从runtime说起,还记得我在第2点说得一句话么:“Runtime is everything between your each function call.”MRC是一个古老的内存管理哲学,谁分配谁释放。通过counting来计数到底该资源有几个使用者。道理很简单,但是往往简单的东西人却会犯错。从来没有一个程序员可以充满信心的说,我写得代码从来没有过内存泄露。这样来看,我们就更需要让程序可以自己处理这个管理机制,这就需要把这个机制放到runtime里。
所以MRC->ARC就是把内存管理部分从普通开发者的函数中移到了函数外的runtime中。因为runtime的开发原型简单,逻辑层次更高,所以做这个开发和管理出错的概率更小。实际上编译器开发人员对这部分经过无数次测试,所以可以说用ARC几乎不会出错。另外由于编译的额外优化,使得这个部分比程序员自己写得代码要快速很多。而且对于一些通用的开发模式,例如autorelease对象,ARC有更优秀的算法保证autoreleasepool里的对象更少。RC是什么,r-Reference参照,引用 c-counting计数, RC就是引用计数。俗话说就是记录使用者的数量。 例如现在我有一个房间空着,大家可以进去随意使用,但是你进门前,需要给门口的计数牌子+1,出门时候-1。 这时候这个门口的牌子就是该房间里的人数。一但这个牌子变为0我就可以把房间关闭。这个规则可以让NSObject决定是不是要释放内存。当一个对象alloc时候,系统分配其一块内存并且object自动计数retainCount=1 这时候每当[object retain]一次retainCount+1(这里虽然简写也是rc不过是巧合或者当时开发人员故意选的retain这个词吧)每次[object release]时候retainCount-1 当retainCount==0时候object就真正把这快内存还给系统。
第二讲 ARC下的概念和原理
一 基本概念
1.ARC是编译器的特性,不是java的自动回收
2.创建工程时,勾选Automic Reference Counting即可
3.使用ARC时,对象将不能调用releas,retain,retaincount方法
4.允许重写dealloc但不能[super dealloc]
第三讲 基本原理
1.只要没有强指针指向对象,该对象就会被销毁,释放对象,也就是说如果一开始只有弱指针指向对象,那么是无意义的,一开始就会被回收。
2.指针默认都是强指针,修饰符;__strong:连续两个下划线,相当于原来的retain,只适用于OC对象
3.弱指针:__weak,弱指针是没法决定对象的内存是否被回收,只有强指针可以决定。相当于原来的assign,只适用于OC对象
弱指针指向的对象如果被回收了,弱指针本身也会被自动置空,避免野指针问题
4.assign还是适用于基本数据类型
int main() { Person *p = [[Person alloc] init]; __weak Person *p2 = p; p=nil;//此时的Person对象已经被回收 p2=nil; return 0; }
实例代码:
int main() { Dog *d = [[Dog alloc] init]; Person *p = [[Person alloc] init]; p.dog = d; d = nil;//指向狗的指针为空,但是人的强指针还在指向狗,所以,这里的狗不会被回收! p = nil;//指向人的指针为空,人对象被回收,对象的成员变量dog也被回收,此时没有指针指向狗,所以狗也被回收! return 0;
}
四 把手动代码管理的旧工程,自动转换为ARC下的工程代码
点击XCode: edit -> refactor -> convert to oc ARC
第四讲 ARC使用的特点以及注意事项
1 不允许调用release,retain ,retaincount
2 允许重写dealloc,但是不允许调用[super dealloc]
3 @property的参数:
strong: 强指针 相当于retain
weak: 弱指针 相当于assign
assign: 基础类型,非oc对象
注意事项:只要是弱指针对象不存在,就直接把弱指针做清空(赋值为nil)
ARC中在property 处不再使用retain,而是使用strong,在dealloc中不需要在[super dealloc];
第五讲 分类(Category)的概念和使用流程
作用:Category在步修改原有类的基础上增加新的方法
一个庞大的类可以分模块开发,可以由多个人来编写,更有利于团队合作
使用分类的目的:1对现有类的拓展 2 作为子类的替代手段 3对类中方法归类
使用分类的步骤:
先申明分类->实现分类 ->使用分类,直接看一个分类的申明和实现的代码:
int main(int argc,const char *argv[]) { @qutoreleasepool{ NSLog(@"Hello World!"); } return 0; }
使用步骤:
1 此处申明一个类
@interface Person:NSObject
@end
2 申明一个分类
格式:
@interface 待拓展的类名(分类的名称)
@end
Person+base –>分类文件的命名规则
如:
@interface Person(base)
- (void) eat;
- (void) run;
@end
2 实现这个分类
格式:
@implementation 待拓展的类(分类的名称)
@end
3使用分类的方法:和使用类中原有对象一样
实例:
新建一个objectiveC.file文件 File:playGame FileType:Category Class:Person
//.h文件 #import "Person.h" @interface Person (playGame) //增加一个类别,类别的名称playGame 给Person 增加新的方法 - (void)playLOL; - (void)playDota; @end //.m文件 #import "Person+playGame.h" @implementation Person(playGame) - (void)playLOL { NSLog(@"123"); } - (void)playDota { NSLog(@"321"); } //注意:如果之前已经把分类放到一个独立的文件中,那么在main()中需要先导入头文件
第六讲 block的用法
1 block的基本概念
它除了有可执行代码以外,还包含了与堆,栈内存绑定的变量。因此,block对象包含一组状态数据,这些数据在程序执行时用于对行为产生的影响。
你可以用block来写一些可以传到api中的函数语句,可选择性的存储,并可以使用多线程,作为一个回调,block非常有用,因为它既包含回调期间执行的代码,又包含执行期间需要的数据。
它是c语言就有了不是oc中独有的!!!
2 block的基本用法
用^操作符来申明一个block变量,并指明block语句的开始。主体部分包含在{}中,int(^myBlock)(int)=^(int num){return num*num;}
block最简单的形式:
定义格式:
void
int main(int argc, const char *argv[]) { //参数有返回值 //定义一个变量myBlock2 同时进行赋值 void(^myBlock2)(int,int)=^(int a,int b) { NSLog(@"a+b=%d",a+b); }; myBlock2(33,23); myBlock2=^(int x,int y) { 9d17 int m=x>y?x:y; NSLog(@"max=%d",m); }; myBlock2(34.21); } //参数无返回值 //无参数有返回值 //无参数无返回值 void (^myBlock()=^()) { printf("xxxxx"); }; return 0; }
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件