黑马程序员—— OC加强---ARC+Category+Block

——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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值