Object - C: Block 의 실현 방식

7954 단어
발췌:http://www.cnblogs.com/GarveyCalvin/p/4204167.html>
Date : 2015-12-4
 
선언: 블록 을 패키지 함수 로 사용 할 수 있 습 니 다. 외부 변수 와 부분 변수 에 접근 할 수 있 지만 기본적으로 외부 변 수 를 수정 할 수 없습니다.대리 (Delegate) 를 사용 하 는 것 보다 직관 적 으로 그것 을 사용 할 수 있다.그 나 저 나 애플 의 많은 인터페이스 (API) 는 Block 을 사용 했다.
 
1. Block 의 기본 정의
Block 의 기본 표기 법 (상세 표기 법):
returnType (^blockName)(params) = ^returnType(params) {
    // code... 
};

 
중국어 재해 석: 반환 형식 (^ Block 의 이름) (Block 의 인자) = ^ 반환 형식 (Block 의 인자) {여기에 코드 를 넣 습 니 다}, 예:
int (^myBlock)(int num1, int num2) = ^int(int num1, int num2){
    return 100;
};

 
Block 이 형식 과 인 자 를 되 돌려 주지 않 아 도 된다 면 다음 과 같이 간략하게 쓸 수 있 습 니 다.
void (^myBlock2)() = ^(){
    
};

혹시
void (^myBlock2)(void) = ^void(void){
    
};

형식 이나 인 자 를 되 돌려 줍 니 다. 없 으 면 'void' 로 대체 할 수 있 습 니 다.
 
너 도 오른쪽 과 같은 번호, ^ 후의 () 를 삭제 할 수 있다. 즉:
void (^myBlock2)() = ^{
    
};

 
이렇게 하면 깔끔 하지 않 아 요?
 
당신 도 먼저 Block 함 수 를 정의 할 수 있 지만 함수 의 실현 을 쓰 지 않 습 니 다. 우 리 는 뒤에서 구체 적 인 함수 의 실현 을 쓸 수 있 습 니 다. 이렇게:
void (^myBlock2)(void);
myBlock2 = ^{
    
};

 
 
2. Block 을 방법 으로 정의 합 니 다.
Block 을 방법 에 정의 합 니 다. 위 와 달리 Block 의 이름 은 성명 할 때 쓰 지 않 고 뒤에 쓰 십시오. 이렇게:
- (void)getWtihBlock:(void (^)())block
{
    // code...
    
    //      block
    block();
}

 
사용 방법:
[self getWtihBlock:^{
    NSLog(@"sdf");
}];

 
다음은 상세 한 예 를 들 어 설명 을 썼 다.
/**
 *         N (          
) * * @param string * @param count * @param stringBlock Block, str
*/ // Block , Block // IOS API Block, UIView - (void)getStrWithString:(NSString *)string CopyCount:(int)count resultString:(void (^)(NSString *str))stringBlock { NSMutableString *newString = [NSMutableString stringWithString:string]; for (NSUInteger i = 0; i < count; i++) { NSUInteger len = [string length]; NSString *insertString = [NSString stringWithFormat:@"
%@
", string]; [newString insertString:insertString atIndex:len]; } // block, newString stringBlock(newString); }

 
용법 도 마찬가지다.
BlockObject *block = [[BlockObject alloc] init];
[block getStrWithString:@"Garvey"
              CopyCount:3
           resultString:^(NSString *str) {
               // str       
               NSLog(@"str is %@", str);
           }];

 
가끔 복잡 한 Block 문법 은 함수 의 성명 을 읽 기 어렵 게 하기 때문에 type: def 를 사용 하여 Block 에 새로운 유형 을 만 듭 니 다.
typedef void (^ResultBlock)(NSString *str);

 
방법 을 정의 할 때:
- (void)getStrWithString2:(NSString *)string
                CopyCount:(int)count
             resultString:(ResultBlock)stringBlock;

 
type: def 앞 뒤 를 비교 해 봅 시다.
//    
- (void)getStrWithString:(NSString *)string
               CopyCount:(int)count
            resultString:(void (^)(NSString *str))stringBlock;

//    
- (void)getStrWithString2:(NSString *)string
                CopyCount:(int)count
             resultString:(ResultBlock)stringBlock;

 
주의: 사용 방법 은 같 습 니 다. 다만 정의 가 간단 해 졌 을 뿐 입 니 다.
 
 
프 록 시 (Delegate) 를 계속 사용 하여 방법 을 바 꾸 고 있다 면, 이 제 는 Block 을 사용 해 보 세 요.
 
 
박문 작가: Garvey Calvin
박문 출처:http://www.cnblogs.com/GarveyCalvin/
본 논문 의 저작권 은 작가 와 블 로그 원 에 공유 되 어 있 습 니 다. 전 재 를 환영 하지만 이 성명 을 보류 하고 원문 링크 를 제시 해 야 합 니 다. 합작 해 주 셔 서 감사합니다.

좋은 웹페이지 즐겨찾기