您的位置:首页 > 职场人生

黑马程序员—— 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还是适用于基本数据类型

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android ios