iOS开发————对象间通信之block

一、block的概念:

别称:代码段,块,闭包,是苹果公司添加到OC语言中的。

作用:在程序运行的过程中保存一段代码,并且这段代码可以进行传递。

应用:用于对象间的通信。

二、block的语法:

和函数指针的语法相似
要设定block的返回值和参数个数及类型。

(1)定义:

无参无返回值的block变量:void (^myBlock)(void)

有参数有返回值的block变量 int (^sumBlock)(int, int);

(2)赋值:

 myBlock = ^{
 //block中的代码
 };
 sumBlock = ^(int a, int b) {
    return a + b;
 };

(3)调用:

myBlock();
sumBlock(3,4); 如果参数则需要指定实参。
typedef简化block类型的书写:类型名第一个字母要求大写:
 	typedef void (^MyBlock)(void); //定义类型别名MyBlock
 	typedef int (^AthematicBlock)(int, int); //定义类型别名AthematicBlock
 	//可以使用类型别名来定义变量
	 MyBlock block1;
	 AthematicBlock block2;

三、block内部去访问外面的变量:

默认情况下block内部不能修改外部定义的局部变量。

给局部变量加上__block关键字,这个局部变量可以在block内部修改。

四、block实现对象间通信:(保姆给小孩洗澡)

1.确定在哪里调用block,在哪里传递block

事件在哪里发生(小孩脏了),就在哪里回调block

事件在哪里响应(给小孩洗澡),就在哪里实现并且传递block(给小孩)(灵活处理)

2.调用block的类 Child

应该定义一个block属性,要设置copy的内存管理策略。

并且在事件发生时要调用block

3.传递block的类 Nanny

定义一个block块,此block中的代码就是对这个事件作出的响应。

将此block赋值给调用block的实例对象(小孩)

举例:在小孩类中设定一个block属性,当小孩脏了的时候调用保姆中实现的洗小孩的block的方法,最后在main中让保姆实现洗小孩的方法

child.h

@interface Child : NSObject

@property NSInteger cleanValue; //清洁度
@property NSInteger happyValue; //快乐度

//- (void)batheChild:(Child *)child;
//定义block类型别名,模仿协议方法的声明
typedef void (^HandleBlock) (Child *);

//定义一个block属性(是HandleBlock类型的,名字是washBlock)
@property (copy, nonatomic) HandleBlock washBlock;

- (instancetype)initWithCleanValue:(NSInteger)cleanValue happyValue:(NSInteger)happyValue;

@end

child.m

#import "Child.h"

@implementation Child

- (instancetype)initWithCleanValue:(NSInteger)cleanValue happyValue:(NSInteger)happyValue {

    self = [super init];

    if (self) {

        NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(timerAction:) userInfo:nil repeats:YES];

        _cleanValue = cleanValue;

        _happyValue = happyValue;
    }
    return self;
}

- (void)timerAction:(NSTimer *)timer {

    _cleanValue--;
    _happyValue--;

    NSLog(@"clean:%li, happy:%li", _cleanValue, _happyValue);

    //当小孩的清洁度下降某个限定值时,通知保姆来给他洗澡
    if (_cleanValue == 95) {

        //调用block,来针对小孩脏了这个事件的处理。
        //判断是否调用到了block
        if (self.washBlock) {
            self.washBlock(self);
        }
    }
}

@end

nanny.h

@class Child;

@interface Nanny : NSObject

- (void)washBaby:(Child *)child;

@end

nanny.m

#import "Nanny.h"
#import "Child.h"

@implementation Nanny

- (void)washBaby:(Child *)child {

    child.washBlock = ^ (Child *child){

        NSLog(@"小孩脏了,保姆把小孩洗白白");

        child.cleanValue = 100;
    };
}

@end

main

#import "Child.h"
#import "Nanny.h"
#import "Grandma.h"
#import <Foundation/Foundation.h>

int main(int argc, const char * argv[]) {
    @autoreleasepool {

        Nanny *nanny = [[Nanny alloc] init];

        Child *child = [[Child alloc] initWithCleanValue:100 happyValue:100];

        [nanny washBaby:child];

        [[NSRunLoop currentRunLoop] run];

    }
    return 0;
}
时间: 2024-08-29 14:35:59

iOS开发————对象间通信之block的相关文章

iOS开发————对象之间通信之代理协议

一.代理实现对象间通信: 确定谁是代理对象,谁是被代理对象. 事件在哪里发生?谁就是被代理对象 事件在哪里响应?谁就是代理对象 需求: 举例:保姆照顾小孩,当小孩脏了时给她清洁,当小孩不开心时陪玩. 被代理类 Child 定义代理属性(id),并且此代理属性要遵守协议 事件发生时,要调用代理属性的协议方法来响应这个事件. 代理类 Nanny 要遵守协议 实现协议方法,协议方法中的内容就是对事件做出的响应. 代理设计模式解决是程序架构上的问题,使程序架构更合理,更具扩展性,降低类与类之前的耦合性.

第23条:通过委托与数据源协议进行对象间通信

第4章:协议与分类 Objective-C 语言有一项特性叫做"协议"(protocol),它与 Jave 的 "接口"(interface)类似.Objective-C 不支持多重继承,因而我们把某个类应该实现的一系列方法定义在协议里面.协议最为常见的用途是实现委托模式,不过也有其他用法.理解并善用协议可令代码变得更易维护,因为协议这种方式能很好的描述接口. "分类"(category)也是 Objective-C 的一项重要语言特性.利用分类

第23条:通过委托与数据源协议进行对象间通信

Objective-C语言特性:协议(protocol),它与Java的“接口”(interface)类似. Objective-C不支持多继承,但可以把类的实现方法定义在协议里面. 协议最为常见的用途是实现委托模式(Delegate pattern). 委托模式(Delegate pattern): 用来实现对象间的通信, 该模式的主旨是:定义一套接口,某对象若想授受另一个对象的委托,则需遵从此接口,以便成为其“委托对象”(delegate).而这“另一对象”则可以给其委托对象回传一些消息,也

iOS开发之---block的使用(详解)

一.基本概念 block (代码块)类似C语言函数指针. 定义一个block的格式:返回值类型 (^变量名)(参数列表)--->void (^blcok)(void). 一般使用typedef重命名block,上面的block定义可以这样写--->typedef void(^MyBlock)(void),MyBlock block. 二.简单使用 block在iOS的开发中,主要用来对象之间的通信,包括值的传递(反向传递)和方法的传递.

IOS开发——OC基础-ARC、BLOCK、协议

一.ARC ARC 是一种编译器特性!而不是IOS运行时特性,和JAVA中得垃圾回收机制完全不一样ARC是自iOS 5之后增加的新特性,完全消除了手动管理内存的烦琐,编译器会自动在适当的地方插入适当的retain.release.autorelease语句.你不再需要担心内存管理,因为编译器为你处理了一切ARC规则:只要还有一个强指针变量指向对象,对象就会保持在内存中弱指针指向的对象被回收后,弱指针会自动变为nil指针,不会引发野指针错误使用注意:1.不允许调用release.retain.re

【读书笔记】iOS网络-应用间通信

一,URL方案 URL方案有3个主要用途:根据设备上其他应用的存在与否调整逻辑,切换到其他应用以及响应打开你的应用的其他应用.你还可以通过URL方案从某个站点或是在基于Web的认证流程结束是打开应用. 1,实现自定义的URL方案. 2,感知其它应用的存在. 3,高级通信. 1)base64编码,专门用于将二进制数据表示为ASCII文本字符串.可以使用一个标准化的转换表格将二进制数据的每6位编码为一个字符. 2)要想创建图像数据字符串,需要使用之前介绍的3个步骤.序列化图片,使用base64对其进

iOS开发总结(A0)- Block

1. 定义block 以返回NSInterger 接受bool 参数为例 1)作为参数 methodTakeBlockAsParamter: (NSInterger (^) (BOOL flag))blockName 2) 作为变量或者property @property(copy, nonatomic)  NSInterger (^blockName) (BOOL flag); 3)typedef typedef  NSInterger (^blockName) (BOOL flag); 2.

iOS开发——对象与字典互相转换

功能 通过自定义Model基类,实现: 1.将json字典转换成对象,无需考虑属性名称和字典键(key)的名称的关系,即可以自定义映射关系.也支持字典中自定义对象的赋值. 2.一行代码将对象转换为json字典. 使用 让自定义的Model类继承自CYZBaseModel即可.然后根据需要选择重写或者调用的方法. 字典转对象: 1.如果字典中的键的名称与对象的属性名称一样,则不需要重新任何方法,或者在attributeMapDictionary中返回nil即可. 2.如果字典中有任一键的名称与对象

iOS开发,应用间的跳转

预习:URL由两部分组成-- 1.scheme:协议头(http://  ftp:// 等等) 2.path:路径(URL中path可以没有) 一.简单实现跳转到指定APP(也就是说跳转到的APP必须有自己的URL) -- 测试APP跳转到wechatAPP 设置APP的URL 在测试APP中点击按钮实现跳转到微信APP                                                                          二.实现跳转到制定页面(控制器