04OC之分类Category,协议Protocol,Copy,代码块block
一、Protocol协议
我们都知道,在C#有个规范称之为接口,就是规范一系列的行为,事物。在C#中是使用Interface关键字来声明一个接口的,但是在OC中interface是用来声明类,所以用了另外一个关键字protocol来表示。
下面我们定义一个动物的协议AnimalDelegate,人Person需要实现这个协议。

Person.h文件

Person.m文件

二、Category分类
何为分类呢?一听这个概念可能很模糊。从C#的角度来说,相当于扩展方法(可以在不修改原本类的情况下使用自定义的方法)。利用分类我们就可以为已有的类添加一些新的方法,特别是系统或者框架的类。在C#字符串中有个Trim()的方法去除左右的空格,用起来很方便,但是在OC中没有,我们一起来扩充一下。
.h文件
#import <Foundation/Foundation.h>
@interface NSString(Extend)
-(NSString *)stringByTrim;
@end
.m文件
#import <Foundation/Foundation.h>
@interface NSString(Extend)
-(NSString *)stringByTrim;
@end
main.m
#import <Foundation/Foundation.h>
#import "NSString_Trim.h" int main(int argc, const char * argv[]) {
NSString *name=@" Kevin ";
//输出
NSLog(@"I'm %@",name);
name=[name stringByTrim];
NSLog(@"I'm %@",name);
return ;
}

三、代码块Block
在c#异步编程中我们经常需要进行函数回调,由于函数回调是异步执行了,如果按正常书写代码无法预知上一个方法什么时候结束,这个时候就要用到匿名委托或者是Lambada表达式将上一个操作为一个参数进行传递,其实在OC中也有类似的方法,称之为代码块。Block就是代码块,一个函数体,一个匿名函数,它是OC对于闭包的实现,在块状中我们可以持有或者引用局部变量,lambada表达式也可以,同时利用Block我们可以将一个操作作为一个参数进行传递,C语言的函数指针也是如此。下面我们使用Block进行点击监听:
KCButton.h:

KCButton.m:

main.m

执行结果如下:
上面的代码使用Block实现了按钮的点击事件,总结如下:
1.Block的类型定义:返回值类型(^变量名)(参数列表)
2.Block的typedef定义:返回值类型(^类型名称)(参数列表)
typedef void(^KCButtonClick)(KCButton *)
3.Block的实现:^(参数列表){操主体}
button.onclick=^(KCButton *btn){
NSLog(@"Invoke Onclikc the Method.The button is :%@",btn);
};
4.Block中可以读取块外部定义的变量,但是不可以修改,如果要修改这个变量必须声明_block修饰
04OC之分类Category,协议Protocol,Copy,代码块block的更多相关文章
- Objective-C-----协议protocol,代码块block,分类category
概述 ObjC的语法主要基于smalltalk进行设计的,除了提供常规的面向对象特性外,还增加了很多其他特性,本文将重点介绍objective-C中一些常用的语法特性. 当然这些内容虽然和其他高级语言 ...
- 从C#到Objective-C,循序渐进学习苹果开发(4)--代码块(block)和错误异常处理的理解
本随笔系列主要介绍从一个Windows平台从事C#开发到Mac平台苹果开发的一系列感想和体验历程,本系列文章是在起步阶段逐步积累的,希望带给大家更好,更真实的转换历程体验.本文继续上一篇随笔<从 ...
- [转]iOS代码块Block
代码块Block是苹果在iOS4开始引入的对C语言的扩展,用来实现匿名函数的特性,Block是一种特殊的数据类型,其可以正常定义变量.作为参数.作为返回值,特殊地,Block还可以保存一段代码,在需要 ...
- 一篇文章看懂iOS代码块Block
block.png iOS代码块Block 概述 代码块Block是苹果在iOS4开始引入的对C语言的扩展,用来实现匿名函数的特性,Block是一种特殊的数据类型,其可以正常定义变量.作为参数.作为返 ...
- iOS学习之代码块(Block)
代码块(Block) (1)主要作用:将一段代码保存起来,在需要的地方调用即可. (2)全局变量在代码块中的使用: 全局变量可以在代码块中使用,同时也可以被改变,代码片段如下: ;//注意:全局变量 ...
- 代码块(block)的使用
Objective-C语法之代码块(block)的使用 代码块本质上是和其他变量类似.不同的是,代码块存储的数据是一个函数体.使用代码块是,你可以像调用其他标准函数一样,传入参数数,并得到返回值. 脱 ...
- 代码块(Block)回调一般阐述
本章教程主要对代码块回调模式进行讲解,已经分析其他回调的各种优缺点和适合的使用场景. 代码块机制 Block变量类型 Block代码封装及调用 Block变量对普通变量作用域的影响 Block回调接口 ...
- iOS代码块block使用
代码块的本质是和其他的变量类似,不同的是,代码块存储的数据是一个函数体.使用代码块,你可以像调用其他标准函数一样的调用,可以传入参数,并得到返回值. 脱字符是代码块的语法标记.下图表示代码块的 ...
- Objective-C 代码块(block)的使用
代码块本质上是和其他变量类似.不同的是,代码块存储的数据是一个函数体.使用代码块是,你可以像调用其他标准函数一样,传入参数数,并得到返回值. 脱字符(^)是块的语法标记.按照我们熟悉的参数语法规约所定 ...
随机推荐
- java Socket编程-基于UDP
package com.wzy.UDPTest; import java.net.DatagramPacket; import java.net.DatagramSocket; import java ...
- Hibernate组件映射
Hibernate联合主键映射以及组件映射 在Hibernate中联合主键的形成有两种可能:一种是由多对多映射形成的,多对多映射会形成第三张表,一般来说第三张表的主键是由其他两张表的主键构成的(比如学 ...
- jdbc java数据库连接 3)Statement接口之执行DDL和DML语句的简化
上一章的代码中,可以发现,jdbc执行DDL和DML有几个步骤都是一样的: 1)执行语句开始时,创建驱动注册对象.获取连接的数据库对象.创建Statement对象 // 创建驱动注册对象 Class. ...
- 为什么目前没有"成熟"的cookie插件?
一.序言 最近真是挺忙的啊,导致也挺久没有时间来看看园中各位大神的文章,只能感慨业务真尼玛的多,所以在此写下一篇文章来大话最近工作和学习上面的一点点收获体会,希望大家能够有所收获,这篇文章虽然说是一篇 ...
- CREATE TABLE 表名 AS SELECT 语句
1.新表不存在复制表结构即数据到新表 ? 1 2 create table new_table select * from old_talbe; 这种方法会将old_table中所有的内容都拷贝过来, ...
- React.js常识
1.React的特点: 简单.声明式-自动dom操作. React核心:组件,组件的设计目的:提高代码复用率,降低测试难度和代码复杂度. 提高代码复用率:组建将数据和逻辑进行封装,类似面向对象的类: ...
- VS使用技巧——统计代码行数
通常为了统计一个文件或者一整个解决管理方案中代码行量,可能会选择定位来获取行量,但是当文件尤其大时,传统方式就不行了,这里推荐使用正则表达式搜索统计,可以快速获取目标文档的总代码量. Tips: ct ...
- JS数组转字符串和字符串转数组
主要用到以下两个函数 join();//将数组转换成字符串split();//将字符串转换成数组 <script type="text/javascript"> var ...
- OpenCV图像细化的一个例子
转自:http://blog.csdn.net/zfdxx369/article/details/9091953?utm_source=tuicool 本文是zhang的一篇经典图像细化论文,效果很好 ...
- 解决:ERROR: Cannot launch Jack server
问题重现: Install: /home/dinphy/sm/out/target/product/ido/system/lib/libdl.so java -Xmx3500m -jar /home/ ...