iOS 개발 - 대상 간 통신의 Block

1. Block의 개념:
별칭: 코드 세그먼트, 블록, 클립은 애플이 OC 언어에 추가한 것이다.
역할: 프로그램이 실행되는 과정에서 코드를 저장하고 이 코드를 전달할 수 있습니다.
적용: 객체 간의 통신에 사용됩니다.
2. Block의 문법:
함수 바늘의 문법과 비슷해서 Block의 반환값과 매개 변수의 개수와 유형을 설정합니다.
(1) 정의:
반환 값이 없는 Block 변수: void (^my Block) (void)
매개 변수가 있고 되돌아오는 값이 있는 Block 변수 int(^sum Block)(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;

 
3. Block 내부에서 바깥의 변수를 방문한다.
기본적으로 Block 내부에서 외부 정의의 국부 변수를 수정할 수 없습니다.
로컬 변수에 더하기Block 키워드, 이 부분 변수는 Block 내부에서 수정할 수 있습니다.
4. Block은 대상간 통신을 실현한다. (보모가 아이를 목욕시킨다)
 1.어디서 Block을 호출하고 어디서 Block을 전달할지 확인
사건이 어디에서 발생했는지, 바로 어디에서 Block을 리셋한다
이벤트가 어디에서 응답(아이를 목욕시키고), 어디에서 이루어지고 Block(아이를 목욕시키고) 전달(유연하게 처리)
 
 2.Block 호출 클래스 차일드
Block 속성을 정의해야 합니다.copy의 메모리 관리 정책을 설정해야 합니다.
그리고 이벤트가 발생할 때 Block을 호출해야 합니다
 
 3.Block을 전달하는 클래스 Nanny
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;
}

좋은 웹페이지 즐겨찾기