您的位置:首页 > 其它

OC加强day2-自动释放池、指针分类、ARC、分类、延展、block

2016-01-24 23:23 316 查看
自动释放池是用来自动释放对象

只有加入到自动释放池,才会去调用release

注意事项:

1.并不是在自动释放池中创建就是加入了,只有调用autorelease方法才算加入自动释放池。

2.如果对象在自动释放池外创建,只要在释放池里面调用autorelease,也能加入到自动释放池

3.如果在自动释放池外调用autuorelease方法,对象不会加入到自动释放池

自动释放池是一个栈结构,先进后出

并不是释放对象,只是延迟调用让对象release一次,等自动释放池结束才调用release

自动释放池不适宜放内存较大的对象

一个对象多次加入自动释放池,那么释放池结束时会多次释放对象

指针分类:

(1)强指针:默认情况下,所有的指针都是强指针,关键字是strong

(2)弱指针:__ weak修饰的指针,前面是两个下划线,中间没有空格

ARC:

基本原则:永远不需要再写retain,release,autorelease这三个关键字

因为ARC会自动帮你在合适的位置插入这三个关键字

在MRC下,系统根据引用计数器的值来判断是否释放对象

在ARC下,只要没有强指针指向,系统就认为需要释放

ARC机制下有几个明显标志:

1.不允许调用对象的release
和 retain

2.不允许使用autorelease

3.可以重写dealloc
但是重写时不能调用[ super dealloc ];

@property两个新关键字:weak,strong

weak 相当于assign 

strong相当于retain

只能用于对象上

若两个对象都是strong类型的彼此指向,则又会造成内存泄露,因为对象彼此指向所以都存在。

ARC中回收对象时,指针自动指向nil

分类:

选择object-c(Category)

在不修改原有类的基础上,增加新的方法(不能修改属性)

文件名:原有类名+你写的分类名

分类声明:@interface
要扩展的类(分类名) @end

分类实现:@implementation
要扩展的类(分类名) @end 

分类中增加方法,和类中增加方法的方式并没有什么不同,也是先在分类的声明文件中声明,而后在实现文件中实现

使用:导入分类,当成自己的方法使用

1.在分类中可以用@property,但是无法生成属性,可以生成set和get方法。但是没有属性,所以set与get方法也不能用。

2.分类中可以用原有类上已经声明的成员变量和属性

3.当原有类中的方法和类方法同名时,优先调用分类中的方法,原来类中的方法被屏蔽。

4.如果多个分类中方法同名了,调用最后编译的那个(Build Phases里Compile Sources里查看)

非正式协议

非正式协议也是一个分类,是给NSObject做的扩展。

给自己的类做扩展,就叫分类;给系统的类做扩展,叫做非正式协议。

字符串方法characterAtIndex:根据角标取字符

延展:也是一个分类,但是一个匿名分类( Extension )

第一种写法:写在一个单独的.h文件中

和分类的区别:

1.文件名是:分类是+,延展是_
,延展只生成.h 文件,分类即生成.h文件也生成.m文件

2.内部:延展是没有分类名的

@interface
类名( ){ }; @end

延展在你要扩展的类中实现

实现分如下步骤:

1.导入延展
2.实现方法

延展中声明的方法依然可以正常使用

第二种写法:直接写在要扩展的类的.m中

当延展是第二种写法时,方法属性是私有的(外界看不到)

延展可以给原有类增加属性,不仅仅是方法

分类是继承的

block

block是一个类型,兼容三种语法:OC      C++     C

block和函数很像,block里面放的是代码段,调用时跟函数一样。

格式如返回值(^block的名字)(形参类型)=^(参数){
}; block的名字();

1.无参无返回值的block void(^myblock)() = ^(){ }; 

2.有参无返回值的block  void(^myblock)(参数) = ^(参数){
}; 

3.有参有返回值的block  int(^myblock)(参数1,参数2)=^(参数1,参数2){
return };
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: