您的位置:首页 > 其它

分类协议

2015-09-01 18:20 267 查看

分类:

分类的作用:不改变原来类内容的基础上为类增加一些方法。

使用注意:

1.分类只能增加原来类的方法,不能增加原来类的成员变量

2.分类方法实现中可以访问原来类中的声明的成员变量

3.分类可以重写原来类中的方法,会导致原来的方法没法使用

4.方法调用的优先级:分类(最后参与编译的分类优先级最高)–原来类–父类,分类不建议覆盖掉原来类中的方法。

类本身也是一个对象,是Class对象。类对象,实例对象。

self super id Class SEL

类的本质:

load方法程序加载

initialize方法

1.当程序启动时,就会加载项目中所有的类和分类,而且加载后会调用每个类和分类的+load方法,只会调用一次。

2.当第一次使用某个类是,就会调用当前类的+initialize方法。

3.先加载父类后加载子类(先调用父类的+load方法,再调用子类的+load方法)

先初始化父类的+initialize方法,再初始化子类的+initialize方法。

方法存储的位置:

每个类方法都存储在类对象中

每个方法都有一个与之对应的SEL类型的对象

根据SEL对象找到方法的地址,进而调用方法

SEL其实是对方法的一种包装,将方法包装称SEL类型的数据,去找对应的方法地址,找到方法地址就可以调用方法。

每个方法都有一个_cmd,代表着当前方法。

block:

block用来保存一段代码

block的标志是:^

block跟函数很像:

1、保存代码

2、有返回值

3、有形参

4、调用方式一样

@protocol协议

协议用来声明方法,只能声明方法,不能实现,也不能声明变量

只要某个类遵守了某个协议,就拥有了这个协议的所有声明的方法

父类遵守了某个协议,子类也就遵守了。

协议的定义:

@protocol 协议名称

@require
// 要求实现的方法,不实现有警告

@option
// 可以不实现,没有警告

@end


遵守协议

@interface 类名:父类 <协议1,协议2>

@end

@implementation 类名

@end


一个协议可遵守另一个协议,这个协议就拥有了另一个协议的所有声明的方法。

基类:NSObject 基协议:NSObject

基类遵守基协议。

前向声明和包含的区别?

声明的时候用 @Class @protocol,真正用到的时候才导入

协议的总结:

1.协议的定义

@protocol 协议名称 <NSObject>
//方法声明
@end


2.遵守协议

@interface 类名 : 父类名 <协议名称>

@end


2>协议遵守协议

@protocol 协议名称 <其他协议名称1,其他协议名称2>

@end


3.协议中方法声明的关键字

1>@required (默认)

要求实现,没实现会警告

2>@optional

不要求实现,

4.定义一个变量的时候,限制这个变量保存的对象遵守某个协议

类名<协议> *变量名

id<协议> 变量名

NSObject<MyProtocol> *obj;
id<MyProtocol> obj2;


如果没有遵守协议,会有大的警告

5.@property 中声明的属性也可以做一个遵守协议的限制

@property (nonatomic,strong)类名<协议名称> *属性名

6.协议定义在单独的.h文件中,也可以定义在某个类中

1>若果这个协议只用在某个类中,就应该定义在这个类的.h文件中

2>如果这个协议用在多个类中,就应该定义在单独的文件中。

7.分类可以定义在.h和.m文件中,也可以定义在单独文件中

内存管理:

循环引用:

一端用retain,一端用assign

autorelease 会将对象放到自动释放池中,当自动释放池被销毁时,会对池子里面的对象进行一次release操作

会返回对象本身,

调用完autorelease后,对象的计数器不变

autorelease的好处

1>不用在关心对象释放的时间

2>不用在关心对象的release

3.autorelease的使用注意

1>占用内存较大的对象不建议使用autorelease

2>占用内存较小的对象使用autorelease,没有太大影响

错误写法:

alloc之后调用了autorelease,又调用了autorelease,release

自动释放池是放在栈中的。

ARC:是编译器特性不是垃圾回收。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: