2014-02-10 4 views
2

iOS 블록에 완전히 새로운 기능입니다. 나는 ios에있는 인라인 블록에 대한 책을 읽었습니다. 인라인 블록이란 정확히 무엇입니까? 우리는 그것을 어떤 물건과 함께 사용할 수 있습니까? 정상 및 인라인 블록의 차이점은 무엇입니까? iOS의 인라인 블록

는 재사용없는 내가 인라인 블록 대신 블록은 위의 예에서와 같이, 인라인 정의

NSArray* arr2 = [arr sortedArrayUsingComparator: ^(id obj1, id obj2) { 
    NSString* s1 = obj1; 
    NSString* s2 = obj2; 
    NSString* string1end = [s1 substringFromIndex:[s1 length] - 1]; 
    NSString* string2end = [s2 substringFromIndex:[s2 length] - 1]; 
    return [string1end compare:string2end]; 
}]; 

콜백 함수를 사용하여 책

에 보았던이고; ArrayUsingComparator : 동일한 콜백을 사용하여 콜백을 두 번 완전히 작성해야합니다. 이러한 반복을 피하기 위해 또는 간단히하기 위해 블록을 변수에 할당 할 수 있습니다.이 변수는 아래 예에서와 같이 블록을 예상하는 메소드에 인수로 전달됩니다. 변수 블록 할당

NSComparisonResult (^sortByLastCharacter)(id, id) = ^(id obj1, id obj2) { 
    NSString* s1 = obj1; 
    NSString* s2 = obj2; 
    NSString* string1end = [s1 substringFromIndex:[s1 length] - 1]; 
    NSString* string2end = [s2 substringFromIndex:[s2 length] - 1]; 
    return [string1end compare:string2end]; 
}; 

있는 NSArray * arr2 = sortedArrayUsingComparator 도착 : sortByLastCharacter]; NSArray * arr4 = [arr3 sortedArrayUsingComparator : sortByLastCharacter]; 아마도 블록의 가장 주목할만한 기능은 다음과 같습니다. 블록이 정의 된 지점의 범위에있는 변수는 나중에 블록을 실행할 수 있지만 그 순간 블록 내에서 값을 유지합니다. (기술적으로, 우리는 블록이 클로저라고 말하고, 블록 외부의 변수 값은 블록에 의해 캡쳐 될 수 있습니다.) 블록의이 측면은 나중에 어떤 시점에 또는 심지어 다른 곳에서 실행될 기능을 지정하는 데 유용합니다 실. 아마 당신이 직접 블록 인수 대신에 블록의 정의를 배치 할 수 있음을 의미

+1

그 책은 뭐라고 말 했나요? 너 이해하지 못 했어? 책에 예를 보여주지 않았습니까? – Wain

답변

5

는 : 블록의 유형이

- (void) doSomethingWithBlock:(void(^)(id param))block; 

참고 :

매개 변수로 블록 API를 감안할 때 이다

typedef void(^block_type)(id param); 

, 그것은 매개 변수 유형 id의 PARAM을 가지고을 반환. "라인 중"블록을 정의하는 데 반대

... 
[self doSomethingWithBlock:^(id param) { 
    // implementation 
}); 

: : 이제

, 당신은 블록 인라인 정의 할 수 있습니다

block_type myBlock = ^(id param) { 
    // implementation 
}; 

과를 통해 전화 :

[self doSomethingWithBlock:myBlock];