码迷,mamicode.com
首页 > 移动开发 > 详细

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

时间:2016-05-12 14:40:29      阅读:199      评论:0      收藏:0      [点我收藏+]

标签:

一、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;
}


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

标签:

原文地址:http://blog.csdn.net/lerryteng/article/details/51362561

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!