黑马程序员---OC基础---Block、分类Category、协议protocol
来源:互联网 发布:手游网络加速器排行 编辑:程序博客网 时间:2024/05/29 12:31
------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
一、Block
Block是iOS中一种特殊的数据类型,不同于int、float等数据类型,Block变量是用来保存一段代码的,因此代码从此也可以作为参数传递,功能类似于函数和方法
1.用途:
1)封装一段代码,可在任意时刻执行
2)可以作为函数的参数或函数的返回值
3)苹果官方建议使用Block(用于动画、多线程、集合遍历、网络请求回调等)
2.格式:
返回值类型 (^block变量名)(形参列表) = ^(形参列表){ 代码段 };例:
int (^blockSum)(int,int) = ^(int a,int b){ int sum = 0; sum = a+b; return sum;}这里用Block型封装了一段求两个整形数的和的代码段,调用如下代码:
int sum = blockSum(3,5)3.利用typedef给Blocklei类型取别名,例:
typedef int (^MyBlock)(int,int);MyBlock sum;//sum实际形式如下,是一个有两个形参,返回值为int型的代码块int (^blockSum)(int,int);4.使用技巧:利用助记符(inlineBlock)进行格式提示,可以帮助记忆
二、分类Gategory
Gategory翻译过来可以叫分类、类别或者类目,是OC中特有的语法,类似于C#中的“扩展方法”和“partial”关键字
1.作用
1)在不修改原来类的基础上,为该类扩充一些新方法
2)一个庞大的类可以分模块开发,储存在不同文件中
3)庞大的类可以由多人编写,有利于团队合作
2.目的
1)对现有类进行扩展
2)作为子类的替代手段,直接向类增加方法
3)对类中方法归类,便于更新和维护
3.步骤
——创建新的分类文件命名规则:类名+分类名称
1)声明
——格式:@interface 待扩展类(分类名称) @end
@interface Person(base)-(void)run;@end
这里在Person类的base分类中加入了run方法
——实现:@implementation待扩展类(分类名称) @end
@interface Person(base)-(void)run{ NSLog(@"人会跑");}@end注意在声明中引入"Student.h",实现中引入"Student+Base.h"
4.注意
1)分类只能增加方法,不能增加成员变量
2)分类中可访问原来类的成员变量
3)若分类中与原来类有同名方法,优先使用分类方法
4)若多个分类中都有同名方法优先执行最后编译的分类方法
5.Gategory非正式协议
非正式协议即类别,凡是NSObject或者其子类的类别,都是非正式协议
6.类的延展(Extension)
——概念:也叫延展类别、扩展,是特殊的类别
——作用:可以为类添加额外的实例变量、方法或合成属性
@interface Person(){ int age;}-(void)run;@end——注意:延展类通常放在原类.m文件中,方法的实现只能在原类的.m文件,不能新建.m文件在@implementation Person()实现
三、协议Protocol
Protocol可以声明一些必须实现的方法和选择实现的方法
1.使用流程
新建Source文件选择Object-C中的Protocol
1)定义Protocol
@protocol MyProtocol<NSObject> //定义一个协议名为MyProtocol的协议,且遵守NSObject协议-(void)run; //声明一个遵守本协议后必须实现的方法@end2)采纳协议
@interface Person:NSObject<MyProtocol> //Person类遵守此协议(可以遵守多个协议)@end3)实现协议
在类的.m文件中实现协议中的方法
2.使用注意
1)Protocol中可以声明多个方法,不能声明成员变量
2)类拥有协议的所有方法声明
3)子类也遵守父类的协议
4)Protocol声明的方法可以让任何类去实现
5)OC中不能继承多个类,但可以遵守多个协议
6)基协议<NSObject>是最根本的协议,它声明了很多最基本的方法
7)一个协议在声明的时候也可以遵守另外的协议
3.@required和@optional(主要用于程序员交流)
——@required表示该方法必须实现(默认)
——@optional表示后面的方法可以选择实现
@protocol baseProtocol<NSobject>@required-(void)eat; //本方法必须实现@optional-(void)run; //本方法选择实现@end4.Protocol代理设计模式
传入的对象代替当前类完成某项功能(代替实现某些方法),称为代理模式
1)目的
1)目的
——解耦(主类不在依赖特定某个类型,而是依赖代理,而很多类型都可以作为代理)
——增加程序的灵活性、可扩展性
——通知、事件监听……
2)思路&步骤
——定义协议:声明代理需要实现的方法
——创建一个delegate(代理)类,遵守上面协议
——在需要代理的类中,定义一个遵守代理协议的id类型的成员变量
——在需要代理类方法中调用代理类方法
——在main.m或其他需要代理类的文件中,为代理类成员变量赋值
补充:.h文件中@protocol是告诉编译器这是个协议,在.m文件中导入协议文件
补充:.h文件中@protocol是告诉编译器这是个协议,在.m文件中导入协议文件
0 0
- 黑马程序员---OC基础---Block、分类Category、协议protocol
- 黑马程序员——OC基础学习(五)---分类(Category),代码块Block和protocol代理设计模式
- 黑马程序员——OC基础:block和Protocol及Category
- 黑马程序员------OC基础-----block和protocol
- 黑马程序员 OC基础: Block 和 Protocol
- 黑马程序员——OC基础---分类(Category)、非正式协议及分类延展
- 黑马程序员—OC语言基础—Block类型与Protocol协议小结
- 黑马程序员---OC分类-category
- 黑马程序员——OC—block和protocol协议
- 黑马程序员------OC block(代码块)和protocol(协议)
- 黑马程序员——OC基础---block,protocol
- 黑马程序员——OC基础---Block、protocol
- 黑马程序员——OC基础04—block、protocol
- 黑马程序员-IOS基础之OC分类(Category)
- 黑马程序员——OC热身——Category、Protocol、Block、常用结构体
- 黑马程序员——OC基础---protocol(协议)
- 分类(category)、协议(protocol)
- 黑马程序员---iOS基础---OC中的ARC、分类、block
- 【codevs】p3115 高精度练习之减法
- android应用:如何控制闪光灯
- trick::target实现选项卡切换
- (一一〇)正则表达式的基本使用与RegexKitLite的使用
- JAVA学习第十六天
- 黑马程序员---OC基础---Block、分类Category、协议protocol
- 黑马程序员---struts2学习笔记之五(文件上传)
- HDU 5360 - In Touch(最短路)
- Linux(centos)下mysql编译安装教程
- Android SDK离线下载安装
- Struts 2中的constant详解
- “Error setting expression 'id' with value '[Ljava.lang.String;@e41d4a'”解决办法!
- 安卓设计架构
- leetcode 80: Remove Duplicates from Sorted Array II