iOS에서 Block의 기본 사용 방법

3241 단어
본문 소개
이 장에서는 Block에 대해 많은 구현 연구를 하지 않습니다.기본적인 용법만 설명할 뿐이다.순수한 기초 지식.실제 프로젝트와 결합하여 어떻게 예를 들겠는가.블락은 장면을 사용하여 두 인터페이스에서 값을 전달할 수도 있고 코드에 대한 봉인을 매개 변수로 전달할 수도 있다.GCD를 사용하면 블락의 묘미를 알 수 있다.
Block 소개
블록은 비교적 특수한 데이터 형식이다.그것은 코드를 저장해서 적당한 때에 호출할 수 있다.
블락의 수식.
ARC의 경우 1.만약 코피로 블록을 수식한다면, 이 블록은 퇴적 공간에 저장될 것이다.블락의 내부 객체에 대한 강력한 참조로 인해 반복 참조가 발생합니다.메모리를 풀 수 없습니다.해결 방법: 새 포인터 ( weak typeof (Target) weakTarget = Target) 가 블록 코드 블록의 대상을 가리키고 weakTarget로 조작합니다.순환 인용 문제를 해결할 수 있다.
2. weak으로 블록을 수식하면 해당 블록은 창고 공간에 저장됩니다.순환 인용 문제가 발생하지 않습니다.
MRC의 경우 copy로 수식한 후 블록 내부에서 대상을 사용하려면 ( block typeof (Target) BlockTarget = Target) 처리를 해야 한다.Block에서 BlockTarget로 작동합니다.
Block의 정의 형식
반환값 형식 (^block 변수 이름) (형삼 목록) = ^(형삼 목록) {};Block에 저장된 코드 Block 변수 이름 호출하기(실참);
기본적으로 Block 내부는 외부의 부분 변수를 수정할 수 없습니다. Block 내부는 수정할 수 있습니다block 수식의 국부 변수
블락 모드
1. 매개 변수가 없고 반환 값이 없는 블락 2.매개변수가 있고 반환 값이 없는 Block 3.매개변수가 있고 반환 값이 있는 블록
Block 간단한 사용 예
매개 변수 없음 반환 값 없음 블록
/**
 *          Block
 */
-(void)func1{
    /**
     *  void :      
     *  emptyBlock:   block   
     *  ():        。        ,        
     */
    void (^emptyBlock)() = ^(){
        NSLog(@"   ,     Block");
    };
    emptyBlock();
}

반환 값이 없는 매개변수가 있는 블록
/**
     *      block        
     *
     *  @param int   A
     *  @param int   B
     *
     *  @return     
     */
    void (^sumBlock)(int ,int ) = ^(int a,int b){
        NSLog(@"%d + %d = %d",a,b,a+b);
    };
    /**
     *      sumBlock Block,      20
     */
    sumBlock(10,10);

매개변수가 있고 반환 값이 있는 블록
/**
     *         
     *
     *  @param NSString    1
     *  @param NSString    2
     *
     *  @return          3
     */    
    NSString* (^logBlock)(NSString *,NSString *) = ^(NSString * str1,NSString *str2){
        return [NSString stringWithFormat:@"%@%@",str1,str2];
    };
    //  logBlock,       Block
    NSLog(@"%@", logBlock(@"  ",@"Block"));

Block 결합 typedef 사용
스스로 블록의 유형을 정의하고 정의된 유형으로 블록을 만들면 더욱 간단하고 편리하다.여기에는 Block 콜백을 예로 들어 화면의 배경색을 수정합니다.ViewController1 디렉터 1, ViewController2 디렉터 2 디렉터 1에서 디렉터 2로 이동한 다음 디렉터 2에서 이벤트를 트리거하여 디렉터 1의 배경색을 빨간색으로 바꿉니다.
ViewController2의 구현
#import 
@interface ViewController2 : UIViewController
/**
 *       changeColor Block。  changeColor       ,          id   
 *      
 *  @param id
 */
typedef void(^changeColor)(id);
/**
 *        changeColor    Block,     Block         。
 */
@property (nonatomic, copy) changeColor backgroundColor;
@end
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
    //      
    UIColor *color = [UIColor redColor];
    //        Block             
    self.backgroundColor(color);
}

ViewController1의 실현
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
    ViewController2 *vc =[[ViewController2 alloc]init];
    //       
    vc.backgroundColor = ^(UIColor *color){
        self.view.backgroundColor = color;
    };
    [self.navigationController pushViewController:vc animated:YES];
}

좋은 웹페이지 즐겨찾기