黑马程序员—— 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;}
0 0