Block 보완

4616 단어

block 선언/정의

  • Block의 역할: 코드 저장
  • //   :   (^block   )(  )
        void(^block)();
    
       //   
        //    :
        void(^block1)() = ^(){
            NSLog(@"  block1");
        };
    
        //   Block,      Block    
        block1();
    
        //    :block      ,    ()
        // void(^)()
        void(^block2)() = ^{
    
        };
    
        //    :block   ,       
        //   :int(^)()
        int(^block3)() = ^int{
    
            return 2;
        };
    

    Block 속성 추가

    // Block    .       
    // block:   
    @property (nonatomic ,strong) void(^block)();
    

    Block 메모리 관리(ARC 아님)

  • 메모리의 5대 영역을 먼저 살펴보십시오.
  • 스택: 수동 관리 메모리 필요
  • 창고: 수동으로 메모리를 관리할 필요가 없습니다. 코드 블록이 지나면 창고 안의 메모리가 자동으로 비워집니다
  • 방법 영역(코드 영역)
  • Global Zone(정적 Zone)
  • 상량구
  • 비 ARC 환경을 판단하는 방법:
  • dealloc 다시 쓰기, super 호출, ARC에서 [super dealloc]
  • 호출 불가
  • retain,release 등을 호출할 수 있는지 판단
  • 비 ARC 개발 중 주의
  • 액세스 속성, 직접 사용하지 않음,set, get 방법으로 접근
  • 비 ARC에 weak-->assign,strong-->retain
  • 이 없음
  • Block이 대상인가요?공식 문서, Block이 대상
  • 비 ARC 환경, Block에서 메모리를 관리하는 방법
  • Block이 외부 국부 변수에 접근하지 않았을 때 전역에 저장
  • 블록은 외부 국부 변수에 접근했고 블록은 창고에 넣었다
  • Block이 접근한 변수가 전체 app에 있는 변수라면 전역 구역
  • 에 있음
  • 비 ARC에서는 Retain 인용 블록을 사용할 수 없습니다. Retain을 사용한 후 블록을 더미에 넣지 않습니다. 비 ARC에서는 코피만 사용할 수 있고 블록을 더미에 넣을 수 있습니다

  • Block 메모리 관리(ARC 아님)

  • Block은 외부 국부 변수에 접근하고 Block은 더미에 저장
  • strong으로 인용할 수 있음
  • ARC에서 기본 국부 대상 변수는 모두 강한 바늘이지만 다른 강한 바늘 인용이 없으면 코드가 있는 괄호를 지나면 삭제됩니다
  • Block 순환 참조

    - (void)viewDidLoad {
        [super viewDidLoad];
        int a = 0;
    
        // Block    , block      
        // block             ,            .
        __weak typeof(self) weakSelf = self;
    
        _block = ^{
    
            __strong typeof(weakSelf) strongSelf = weakSelf;
    
            dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2* NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
    
                NSLog(@"    %@",strongSelf);
    
            });
    
        };
    
        _block();
    }
    

    set 메소드 메모리 관리

  • retain에 필요한 대상
  • release 이전 대상
  • 들어오는 대상과 이전의 차이만release와retain
  • 이 필요합니다.
    - (void)setRoom:(Room *)room
    {
        //       
        if (room != _room)
        {
            //           (   )   release
            [_room release];
    
            //        retain  
             _room = [room retain];
        }
    }
    

    block 변수 전달

    //     5:   
    - (void)viewDidLoad {
        [super viewDidLoad];
        int a = 5;
    
        void(^block)() = ^{
            NSLog(@"%d",a);
        };
        a = 10;
        block();
    }
    
    //     10:    
    - (void)viewDidLoad {
        [super viewDidLoad];
    
        static int a = 5;
    
        void(^block)() = ^{
            NSLog(@"%d",a);
        };
        a = 10;
        block();
    }
    
    //     10:    
    - (void)viewDidLoad {
        [super viewDidLoad];
    
        __block int a = 5;
    
        void(^block)() = ^{
            NSLog(@"%d",a);
        };
        a = 10;
        block();
    }
    
    //     10,    
    static int a = 5;
    - (void)viewDidLoad {
        [super viewDidLoad];
    
        void(^block)() = ^{
            NSLog(@"%d",a);
        };
        a = 10;
        block();
    }
    
  • 총괄: 전역 변수나 국부 변수가static 또는 에 의해Block 수식, 그러면 Block 블록이 외부에 접근하는 변수는 지침 전달이고 일반적인 국부 변수는 값 전달
  • Block을 매개 변수로 사용

  • 왜 Block을 매개 변수로 사용합니까
  • 사용 장면: 자신이 하나의 종류를 봉인할 때 어떤 일은 외부에서 결정하지만 언제 할 것인지, 내부에서 결정할 때 Block
  • 을 사용한다.
  • 수요: 계산기를 봉하여 계산 방법을 제공하고 어떻게 계산하는지는 외부에서 결정하고 언제 계산하는지 스스로 관리한다
  • //        
    - (void)viewDidLoad {
        [super viewDidLoad];
    
        //          
        CalculateManager *manager = [[CalculateManager alloc] init];
        [manager calculateManager:^(int result){
            result = result + 5;
            result = result * 5;
            return result;
        }];
        NSLog(@"%d",manager.result);
    
    }
    
    //              ,_result       
    -(void)calculateManager:(int(^)(int))block
    {
        //     
    //    ^(_result){
    //        result = result + 5;
    //        result = result * 5;
    //        return result;
    //    }
        _result = block(_result);
    }
    

    block 매개 변수로 되돌아오기

  • 이후 호출 방법만 보면 () Block을 반환값으로 사용
  • - (void)viewDidLoad {
        CalculateManager *manager = [[CalculateManager alloc] init];
        //         
        manager.add(5).add(5).add(5).add(5);
        NSLog(@"%zd",manager.result);
    }
    
    -(CalculateManager *(^)(NSInteger))add
    {
        return ^(NSInteger value){
    
            _result += value;
            return self;
        };
    }
    
    

    좋은 웹페이지 즐겨찾기