黑马程序员——OC之Category、Block

------  Java培训、Android培训、iOS培训、.Net培训期待与您交流! ------

http://www.itheima.com

  • Category:可以被翻译为类别、分类、类目等,其作用是:将一个类中的不同方法分到多个不同的文件中存储, 便于对类进行模块化设计、团队合作开发;可以在不修改原来类的基础上, 为这个类扩充一些方法。
  • 分类的命名规则:类名+扩展方法,例如:"Person+study"
  • 分类的声明格式:

@interface 待扩展的类名 (分类的名称)

//待扩展的方法

@end

  • 分类的实现格式:

@implementation 待扩展的类名 (分类的名称)

//扩展的方法

@end

  • 调用分类中的方法和调用普通类中的方法一样:[对象名 扩展的方法名];
  • 分类的使用注意事项:

1.分类的声明中不能声明实例变量,也不能使用 @property。

2.分类的方法中,可以访问类中的实例变量,例如:

@interface Person : NSObject

{

    int _age; 

}

@end

@implementation Person (base)

-(void)information{

//访问类中的实例变量

  NSLog(@"age  = %d",_age);

}

@end

3.在分类中存在和类同名的方法时,优先访问分类的方法。

4.当在多个分类中有同名的方法时,执行最后编译的那个类别的同名方法。

  • 非正式协议:所谓的非正式协议就是给NSObject或者其子类Foundation框架中的类增加的分类。例如,下面的非正式协议的使用:

给NSObject增加一个分类:

@interface NSObject (run)

-(void)eat;

@end

@implementation NSObject (run)

-(void)eat{

   NSLog(@"吃东西");

}

@end

所有继承NSObject的子类都能调用run方法或者重写run方法。

  • 延展:延展是一个特殊的分类,可叫做匿名的类别或者类扩展,延展可为一个类增加额外的原来没有的变量、方法。
  • 特点:可以在延展中定义实例变量,该实例变量默认是私有类型,作用范围只能在自身类;延展所声明的方法必须依托对应类的实现部分来实现,其没有独立的实现部分;定义在.m文件中的类扩展方法为私有的,在.h文件中声明的类扩展方法为公有方法,延展是在.m文件中声明私有方法的非常好的方式。
  • Block:是一种类型,用^操作符来声明一个Block变量,Block变量用来存放代码块
  • 四种形式:

1.无参无返回值
定义格式:void (^变量名)()=^(){代码块;};   优化后的格式:void (^block变量名)()=^{代码块;};
使用格式:变量名();
2.有参无返回值
定义格式:void (^变量名)(参数类型及个数) = ^(形参列表){代码块;};
使用格式:变量名(对应类型、个数实参);例如:

void (^plus)(int ,int )=^(int a,int b){

            NSLog(@"a + b = %d",a+b);

        };

plus(30,10);

3.有参数有返回值

定义格式:返回值类型 (^变量名)(参数类型及个数) = ^(形参列表){代码块;};
使用格式:变量名(对应类型、个数实参);例如:

int (^plus)(int a,int b ) = ^(int x,int y){

            return x+y;

        };

int sum = plus(10,20);

4.无参有返回值
定义格式:返回值类型 (^变量名)() = ^(){代码块;};
使用格式:变量名();例如:

 int (^plus)( ) = ^(){

            int x=5;

            int y=6;

            return x+y;

        };

        int sum = plus();

  • block的typedef
1.格式:typedef 返回值类型(^block变量名)(参数类型列表);例如:

  typedef int (^new)(int ,int );

        new a ;

这样我们就定义了一个类型new,用new定义了block变量a。然后我们可以给变量a赋值,如:

a = ^(int a,int b){

         return a+b;};

  • block访问外部变量:在block内部可以访问block外部的变量,并且可以修改block外部的全局变量(经测试全局变量的地址和block内部使用的全局变量的地址是同一个地址),但是不可以修改block外部的局部变量(当定义block的时候,block把外部的局部变量以const的方式复制一份到block的所在的内存中);若非要在block内部修改变量的值,则block外部的局部变量定义时要加上__block,如__block int = 10,这时修改的是block所在空间的a的值,存放在栈区的a的值是不变的,不过如果我们用__block修饰变量a,之后我们再使用变量a时,使用的是block所在空间的a值;另外block内部也可以定义和block外部的同名的变量,该变量存放在栈区,此时局部变量会暂时屏蔽外部变量的作用域。
  • block作为函数的返回值
步骤:
1.使用typedef 定义一个新的类型:

typedef int(^newType)(int ,int );

2.用新定义的类型作为函数的返回值:

newType add(){

    return ^(int a,int b){

        return  a+b;

    };

}

3.定义block变量接收函数返回的结果:

newType n = test();

4.执行block代码块:

n();

  • block作为方法的参数

//定义新类型

typedef void(^BlockType)();

//声明方法,block类型的参数

@interface Person : NSObject

-(void)test:(BlockType) block;

@end

//实现方法

@implementation Person

-(void)test:(BlockType) block{

    if (block !=nil) {  

//执行代码块

      block();       

    }

}

@end

//调用方法,block代码块作为参数传递

[p test:^{NSLog(@"hello word!");}];


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
城市应急指挥系统是智慧城市建设的重要组成部分,旨在提高城市对突发事件的预防和处置能力。系统背景源于自然灾害和事故灾难频发,如汶川地震和日本大地震等,这些事件造成了巨大的人员伤亡和财产损失。随着城市化进程的加快,应急信息化建设面临信息资源分散、管理标准不统一等问题,需要通过统筹管理和技术创新来解决。 系统的设计思路是通过先进的技术手段,如物联网、射频识别、卫星定位等,构建一个具有强大信息感知和通信能力的网络和平台。这将促进不同部门和层次之间的信息共享、交流和整合,提高城市资源的利用效率,满足城市对各种信息的获取和使用需求。在“十二五”期间,应急信息化工作将依托这些技术,实现动态监控、风险管理、预警以及统一指挥调度。 应急指挥系统的建设目标是实现快速有效的应对各种突发事件,保障人民生命财产安全,减少社会危害和经济损失。系统将包括预测预警、模拟演练、辅助决策、态势分析等功能,以及应急值守、预案管理、GIS应用等基本应用。此外,还包括支撑平台的建设,如接警中心、视频会议、统一通信等基础设施。 系统的实施将涉及到应急网络建设、应急指挥、视频监控、卫星通信等多个方面。通过高度集成的系统,建立统一的信息接收和处理平台,实现多渠道接入和融合指挥调度。此外,还包括应急指挥中心基础平台建设、固定和移动应急指挥通信系统建设,以及应急队伍建设,确保能够迅速响应并有效处置各类突发事件。 项目的意义在于,它不仅是提升灾害监测预报水平和预警能力的重要科技支撑,也是实现预防和减轻重大灾害和事故损失的关键。通过实施城市应急指挥系统,可以加强社会管理和公共服务,构建和谐社会,为打造平安城市提供坚实的基础。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值