Block과 그 실제 응용에 대한 분석 (1)

2431 단어
작가님도 최근에야 Block에 전화가 왔기 때문에 이해에 편차가 있을 수 있습니다.우선 Block이 무엇인지 대충 말해 보세요.Block은 마치 익명 함수 같다.그의 강점은 두 대상 사이에서 데이터를 전달할 수 있다는 데 있다.그는 함수 인용 전달보다 더욱 직관적이다.예를 들어 협의와 비교하다.Block은 폐쇄적으로 실행되어 주위 환경의 상태를 더욱 잘 포착할 수 있다.중점적으로 말하자면, 그는 OC의 한 대상이다.
Block을 만들고 호출하는 것은 앞에서 말했듯이 Block은 익명 함수와 같아서 함수의 모든 기능을 실현할 수 있습니다.그러나 동시에 그는 OC 대상이기 때문에 그의 정의는 두 가지 풍격을 겸비하고 있다
void (^block)() = ^{
        NSLog(@"hello world");
};

블락의 구체적인 정의를 살펴보자. 이때 우리는 그가 함수의 정의와 거의 똑같다는 것을 알 수 있다. 단지 ^가 많을 뿐이고 대상의 특징을 가지고 값을 부여할 수 있다.위의 코드는 반환값이 비어 있는 Block이라는 Block 대상을 정의한 것으로 그의 기능은'hello World'를 출력하는 것이다.호출은 c 언어와 마찬가지로 직접적이다
    blockname(parameters list)

사실 Block의 창설과 호출은 이해하기 어렵지 않습니다. 바로 ^ 어색합니다. 천천히 하세요. 앞으로 많이 쓰면 돼요.
파라미터 목록은 위에서 말한 바와 같이 Block은 당연히 파라미터를 사용할 수 있다.간단한 열을 보아라, 여기는 할 말이 없다.직접 상례
    void (^block)(NSString *) = ^(NSString *name){
          NSLog(@"hello %@", name);
    };
    block(@"Steve");

여러 개의 매개 변수의 독자가 스스로 머리를 좀 고쳐라, 나는 네가 할 수 있다고 믿는다.
반환값은 사실 원래 이것은 내가 직접 쓰려고 했지만 C 함수와 약간의 차이가 있다는 것을 감안하여 나는 그래도 여러분과 똑똑히 쓰겠습니다.글을 보는 흰둥이에게도 도움이 됐으면 좋겠어요.여기서 내가 강조하고자 하는 것은 반드시 C 언어 함수를 유추해야 한다는 것이다. 만약에 당신이 직접 입수한 OC라면 C 언어를 좀 보라고 권장한다.
    int (^sum)(int , int) = ^(int a, int b){
          return a + b;
    };
    NSLog(@"%d", sum(1, 2));

폐쇄성은 이것에 대해 말하자면 이해하기 어려운 글이 있기 때문에 나는 코드 프레젠테이션을 한 후에 자신의 견해를 이야기할 것이다.코드부터 볼게요.
    NSString *treat = @"Hi";
    NSString *(^sayHi)(NSString *) = ^(NSString *name){
        return [treat stringByAppendingFormat:@"%@", name];
    };
    NSLog(@"%@", sayHi(@"Steve"));  //HiSteve
    treat = @"Hello";
    NSLog(@"%@", sayHi(@"Steve")); //HiSteve

위의 운행 결과에서 볼 수 있듯이 블록 내의 비국부 변수는 영향을 받지 않았다.사실 이 실질은 첫 번째treat에 접근했을 때 직접 인용된 변수가 아니라 변수copy를 한 부씩 Block에 상수로 저장하는 것이다.이럴 때 왜 값이 변하지 않는지 알겠지.이럴 때 똑똑한 당신은 내가 직접 Block 내의 값을 가져오고 Block으로 값을 되돌려 주고 싶지 않다고 생각할 것이다.이럴 때 변수 앞에서 +blcok, 아래
    __block int i = 0;
    int (^count)() = ^ {
        return i++;
    };
    NSLog(@"%d", count());   //0
    NSLog(@"%d", count());   //1
    NSLog(@"%d", count());   //2

여기서 다시 한 번 설명하자면 Block은 실제 운행 과정에서 무더기로 복사되는 상황이 발생하기 때문에 일반적인 상황에서 Block은 추가 운행 비용을 발생시킬 수 있다.내일 블록을 유형과 매개 변수로 사용한다고 다시 한 번 말씀드리겠습니다.

좋은 웹페이지 즐겨찾기