黑马程序员—— OC加强---ARC+Category+Block
来源:互联网 发布:java 异或 php 编辑:程序博客网 时间:2024/05/29 20:02
——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还是适用于基本数据类型
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) { int m=x>y?x:y; NSLog(@"max=%d",m); }; myBlock2(34.21);} //参数无返回值 //无参数有返回值 //无参数无返回值 void (^myBlock()=^()) { printf("xxxxx"); }; return 0;}
- 黑马程序员—— OC加强---ARC+Category+Block
- 黑马程序员--OC自学笔记---08ARC、category、block
- 黑马程序员——OC之Category、Block
- 黑马程序员——OC之ARC、Block、Protocol
- 黑马程序员——oc加强学习(block)
- 黑马程序员——OC语言加强---block的typedef
- 黑马程序员-OC加强-Block
- 黑马程序员------OC ARC管理和Category
- OC进阶知识点整理——ARC,Category,block
- 黑马程序员—IOS基础之OC—ARC和Category
- 黑马程序员----oc加强笔记----block
- OC+2-ARC-Category-block
- 黑马程序员——OC语言加强---ARC使用特点及注意事项
- 黑马程序员——OC热身——Category、Protocol、Block、常用结构体
- 黑马程序员——OC基础:block和Protocol及Category
- 黑马程序员——OC语言ARC
- 黑马程序员——OC---ARC
- 黑马程序员——OC语言ARC
- 解决CocoaPods各种慢的方案(gem换源+pod repo换源)
- MyBatis的association示例以及association的两种形式
- 我的电脑的ADT软件解决Fail to create the java Virtual Machine问题
- java多线程 callable和future学习
- 计算机技术领域当前的主流技术及其社会需求调查报告
- 黑马程序员—— OC加强---ARC+Category+Block
- 限制文本框只能输入整数
- 《奥赛经典——数据结构篇》 3.4队列习题
- mysql部分数据复制
- windows环境下训练caffe中cifar10数据集
- hdu 确定比赛名次
- linux 信号设计 --不断补充--欢迎指正讨论
- 矩形面积交
- 联合主键条件过滤查询,记录一点点