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 };
只有加入到自动释放池,才会去调用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 };
相关文章推荐
- Servelt生命周期
- mfc中将接收到的十六进制数保存到TXT文件,保存形式为十进制
- 网上图书商城项目学习笔记-003系统功能模块分析
- 关于sql注入
- iocp还是select
- pygame 写的 flappy bird
- Android 中的 ContentProvider
- JAXB Hello World
- 升级centos的Python至3.5.1
- C# Socket例子留用
- ListView学习(二)-ListView缓存机制
- EasyUI 扩展自定义EasyUI校验规则 验证规则(常用的)
- js中event.keyCode用法及keyCode对照表
- 表单标签
- 脉宽调制器 LT494 原理图
- Efficient Graph-Based Image Segmentation解读
- AMD加载器实现笔记(五)
- 为ViewPager添加适配器
- hdu1002
- android mvp快速开发框架介绍(继续dileber)