A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 蒂尔 中级黑马   /  2016-5-24 23:36  /  445 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

================================ 今天的主要知识点
1、对象的自动释放池的使用
2、ARC机制介绍和使用
3、Category分类
4、block
======================== 今天的主要知识点

-------------- 知识点节
1. 对象自动释放池的使用
1).什么是自动释放池?
自动释放池就是一对花括号包裹起来的作用域,只不过这个作用域前面有一个@autoreleasepool这个关键字来修饰.
2).和普通的作用域的区别
自动释放池能够在作用域结束的时候,能够像自动释放池内部调用了autorelease方法的对象,发送一次release消息
int main(int argc, const char * argv[]) {
    
    @autoreleasepool
    {
        //方法一
        Person *p1 = [[Person new] autorelease];//1
        //方法二
        Person *p2 = [YYPerson new];//2
        [p2 autorelease];
    }//release
    return 0;
}
* autorelease方法
* @autoreleasepool关键字的使用
* 封装一个initWithXxx方法, 在其中使用"对象自动释放池"
1).创建一个类一般还要提供一个和类名相同的类方法,返回一个实例对象,并且需要在这个方法的内部,把这个方法内部创建的对象添加一次autorelease.

2. ARC介绍
* ARC概念介绍
*ARC机制的核心
1>对象的内存管理的代码不需要程序员写,由编译器在编译的时候自动添加,再编译
2>ARC下一个OC对象是否释放,就看这个对象有没有强指针指向,如果没有强指针指向就"立刻"释放,如果有,就不释放
* ARC的判断原则/强弱指针介绍
什么是强指针
在ARC下,对于一个指向OC对象的指针,
用__strong修饰的指针,叫做强指针,如果这个指针前面什么都没有,默认就是强指针
什么是弱指针
在ARC下,对于一个指向OC对象的指针,用__weak修饰的指针,叫做弱指针
* 循环strong问题
解决,一端用strong修饰,一边用weak修饰
* MRC代码转ARC代码

1. @autoreleasepool的嵌套使用(栈方式来存储)
* instancetype只能用作返回值, 不能使用instancetype来声明变量
* id 和 instancetype 的区别
/*
        id -> NSObject * id类型是可以用来声明变量的
        instancetype -> 在哪个类中, 表示的就是哪个类型的指针 XXXX *
        instancetype 只能用作方法的返回值, 不能通过instancetype来声明变量
*/
* 自动释放池是以栈结构来存储的

2. Category分类
* 分类的作用:
1> 将一个类中的不同方法分到多个不同的文件中存储, 便于对类进行模块化设计、团队合作
开发。
2> 可以在不修改原来类的基础上, 为这个类扩充一些方法.
* 分类中只能增加"方法", 不能增加成员变量、@property等。
* 分类可以访问原来类中的成员变量
* 主类与分类中方法的调用优先级问题:
1> 当分类与主类中都有同一个方法的时候, 优先调用分类中的方法。
2> 当多个分类中都有同样的一个方法的时候, 优先调用最后一个参与编译的分类中的方法。

* 类扩展(匿名分类)
0> 类扩展是写在.m文件中的, 为当前类扩展一些私有的成员.
1> 作用: 为某个类扩充一些私有的成员变量和方法.
2> "类扩展"对比"分类", 就少了一个分类名称, 因此也有人称它为"匿名分类".

3. block
* block是一种数据类型, 可以使用这种数据类型定义变量, 并赋值。
* block数据类型在使用前需要先定义该数据类型, 然后再使用(就像使用Person类一样, 先
定义一个Person类, 然后再通过Person类声明一个Person类型变量)。
* block这种数据类型用来保存一个方法、函数、一段代码
* 必须掌握: block的定义语法、使用场景
* 使用inlineBlock辅助编写block代码
//int (^block)(int,int) = ^(int n, int m){};
int (^block)(int,int) = ^(int n, int m){};

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马