分类协议
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:是编译器特性不是垃圾回收。
相关文章推荐
- 保護你的隱私,從 PGP 開始!
- 自定义tableViewCell和设置多选
- Android自定义TextView链接点击和长按事件
- 隐式动画
- Internet of Lights and Switches(MAP记录+二分) 2015年湖南省赛第 I 题
- bzoj1027 [JSOI2007]合金
- ExtJS4学习--多表头Grid
- LoadRunner变量到参数的互换
- Hadoop运行wordcount出现“JobTracker is not yet RUNNING”
- ssh登陆慢的问题
- 十一届蓝狐杯的总结,顺带一点解题报告
- Golang开发环境LiteIDE的设置
- GitHub和SourceTree入门教程
- 打印九九乘法表
- webservice随记
- Java初学者都必须理解的六大问题
- 高质量 Android 开发框架 LoonAndroid 详解
- 移动端Retina屏实现1px的边框
- easyui 带复选功能的下拉菜单
- 云计算设计模式(二十四)——仆人键模式