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

自动释放池是用来自动释放对象

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

注意事项:

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

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

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


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

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

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

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


指针分类:

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

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


ARC

基本原则:永远不需要再写retainreleaseautorelease这三个关键字

因为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,但是无法生成属性,可以生成setget方法。但是没有属性,所以setget方法也不能用。

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

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

4.如果多个分类中方法同名了,调用最后编译的那个(Build PhasesCompile 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 }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值