Blocks 학습

7724 단어 block
Ios4는 이미 Blocks를 직접 지원하고 있으니 공부할 필요가 있다.
ios에서 Blocks는 대상입니다. 이 코드는 언제든지 실행할 수 있도록 봉인되어 있습니다.Blocks는 함수 매개 변수나 함수의 반환값으로 사용할 수 있으며, 그 자체는 입력 매개 변수나 반환값을 가져올 수 있다.이것은 전통적인 함수 바늘과 유사하지만, 차이가 있다. Blocks는 inline이고, 국부 변수는 읽기만 한다.
Blocks의 정의:
  int (^Multiply)(int, int) = ^(int num1, int num2) {return num1 * num2;};

Multiply의 Blocks 대상을 정의했습니다. 이것은 두 개의 int 인자를 가지고 있으며 int를 되돌려줍니다.등식 오른쪽은 바로 Blocks의 구체적인 실현이다. Blocks체에 주의한다.
블록스는 로컬 변수에 액세스할 수 있지만 수정할 수는 없습니다.
int multiplier = 7;

int (^myBlock)(int) = ^(int num) {

     multiplier ++;//    

     return num * multiplier;

};

 
수정할 경우 키워드 추가:block
__block int multiplier = 7;

int (^myBlock)(int) = ^(int num) {

    multiplier ++;//      

    return num * multiplier;

};

함수의 매개 변수로서 Blocks는 어떤 의미에서 리셋 함수나delegate를 대체했다.함수가 호출되면 이벤트가 터치된다고 가정하면 Blocks의 내용이 실행됩니다.이렇게 하면 코드의 통합과 읽기에 유리하므로, 너는 여기저기 의뢰 방법을 실현할 필요가 없다.
시스템 API에는 이미 Blocks 매개 변수가 많이 지원됩니다.
  • Completion handlers
  • Notification handlers
  • Error handlers
  • Enumeration
  • View animation and transitions
  • Sorting

  • 예를 들면 다음과 같습니다.
    [UIView animateWithDuration:(NSTimeInterval)duration animations:(void (^)())animations]

    집합체에서도 Blocks를 활용할 수 있다.하나의 그룹을 열거할 때 우리는 보통 다음과 같다.
    for (id obj in Array);

    지금,
    NSString *area = @"Europe";
    
    NSArray *timeZoneNames = [NSTimeZone knownTimeZoneNames];
    
    NSMutableArray *areaArray = [NSMutableArray arrayWithCapacity:1];
    
    NSIndexSet *areaIndexes = [timeZoneNames         indexesOfObjectsWithOptions:NSEnumerationConcurrent 
    
         passingTest:^(id obj, NSUInteger idx, BOOL *stop) {
    
         NSString  *tmpStr = (NSString *)obj;
    
         return [tmpStr hasPrefix:area];}];
    
     NSArray *tmpArray = [timeZoneNames objectsAtIndexes:areaIndexes];
    
    [tmpArray enumerateObjectsWithOptions:NSEnumerationConcurrent|NSEnumerationReverse usingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
    
    [areaArray addObject:[obj substringFromIndex:[area length]+1]]; }];
    
    NSLog(@"Cities in %@ time zone:%@", area, areaArray);    

    Blocks에서obj는 그룹의 모든 구성원입니다. 우리는 Blocks에서 모든 대상을 처리할 수 있습니다.예를 들면 다음과 같습니다.
    NSMutableArray *mArray = [NSMutableArray arrayWithObjects:@"a",@"b",@"abc",nil];
    
    NSMutableArray *mArrayCount = [NSMutableArray arrayWithCapacity:1];
    
    [mArray enumerateObjectsWithOptions:NSEnumerationConcurrent usingBlock: ^(id obj,NSUInteger idx, BOOL *stop){
    
    [mArrayCount addObject:[NSNumber numberWithInt:[obj length]]];}];
    
    NSLog(@"%@",mArrayCount);

    너는 이렇게 코드를 쓰면 더욱 쉽게 이해할 수 있다는 것을 알게 될 것이다.
    마지막으로 정렬의 예를 보십시오.
        NSArray *stringsArray = [NSArray arrayWithObjects:
    
                                 @"string 1",
    
                                 @"String 21",
    
                                 @"string 12",
    
                                 @"String 11",
    
                                 @"String 02", nil];
    
        static NSStringCompareOptions comparisonOptions = NSCaseInsensitiveSearch | NSNumericSearch |
    
        NSWidthInsensitiveSearch | NSForcedOrderingSearch;
    
        NSLocale *currentLocale = [NSLocale currentLocale];
    
        NSComparator finderSort = ^(id string1, id string2) {
    
        NSRange string1Range = NSMakeRange(0, [string1 length]);
    
        return [string1 compare:string2 options:comparisonOptions range:string1Range locale:currentLocale];
    
        };
    
        NSLog(@"finderSort: %@", [stringsArray sortedArrayUsingComparator:finderSort]);

    결과:finderSort:(
        "string 1",
        "String 02",
        "String 11",
        "string 12",
        "String 21"
    )
    원문

    좋은 웹페이지 즐겨찾기