Upgrade to Pro — share decks privately, control downloads, hide ads and more …


Khoa Pham
August 27, 2015


How block works

Khoa Pham

August 27, 2015

More Decks by Khoa Pham

Other Decks in Programming


  1. Block The closure that Apple adds to C Is an

    object (NSBlock) The compiler translate block literals into struct and functions. So we don’t see the alloc call
  2. Block It is said to be the only object that

    can be allocated on the stack, by default. It is moved to heap when copied.
  3. Syntax The syntax of Objective C block http://arigrant. com/blog/2014/1/18/the-syntax-of-objective-c-blocks From

    C declarators to Objective C block syntax http://nilsou.com/blog/2013/08/21/objective-c-blocks-syntax/ Cheatsheet http://fuckingblocksyntax.com/
  4. Syntax () > [] > *, ^ Start from the

    variable name to right Then to the left Operator precedence http://unixwiz.net/techtips/reading-cdecl.html CDECL http://cdecl.org/
  5. Syntax int (*f)(); f is a pointer to a function

    which accepts nothing and returns an int
  6. Syntax void (^successBlock)(NSDictionary *response); successBlock is a block pointer to

    a function which takes a dictionary and returns nothing
  7. Syntax ^ is the block pointer, which can only be

    applied to function int ^f(); // Error
  8. ^ unary operator BOOL (^customBlock)(NSArray *) = ^(NSArray *array) {

    // return array.count == 3; // Please don’t if (array.count == 3) { return YES; } return NO; };
  9. __block (Kiwi example) describe(@"it takes a while" , ^{ __block

    NSDictionary *apiResponse = nil; beforeAll(^{ __block BOOL requestCompleted = NO; AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest: request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) { requestCompleted = YES; apiResponse = JSON; } failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON) { requestCompleted = YES; } ]; [operation start]; [KWSpec waitWithTimeout:3.0 forCondition: ^BOOL() { return requestCompleted; }]; }); it(@"includes the related objects in the response" , ^{ [[[apiResponse objectForKey: @"children" ] should] containObjects: @"foo", @"bar", @"baz", nil]; }); });
  10. Capture The ability to capture values from the enclosing scope,

    making them similar to closures or lambdas in other programming languages.
  11. weakSelf vs strongSelf __weak __typeof__(self) weakSelf = self; self.block =

    ^{ __typeof__(self) strongSelf = weakSelf; [strongSelf doSomething]; [strongSelf doSomethingElse]; }; The block property is declared as “copy”
  12. weakSelf vs strongSelf Block is allocated on the stack. It

    has no effect on the storage of lifetime of anything it accesses. When they are copied, they take their captured scope with them, retaining any objects they refer
  13. weakSelf vs strongSelf You should only use a weak reference

    to self, if self will hold on to a reference of the block.
  14. UIView animation block [UIView animateWithDuration:0.5 delay:1.0 options: UIViewAnimationCurveEaseOut animations:^{ self.basketTop.frame

    = basketTopFrame; self.basketBottom.frame = basketBottomFrame; } completion:^(BOOL finished){ NSLog(@"Done!"); }];
  15. UIView animation block - (void)loopThisBlock { [UIView animateWithDuration:0.2 animations:^{ someView.alpha

    = (someView.alpha + 1.0) % 2; } completion:^(BOOL finished) { [self loopThisBlock]; }]; } What if the block is executed infinitely ?
  16. AFNetworking callback block AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; [manager GET:@"http://example.com/resources.json"

    parameters:nil success:^ (AFHTTPRequestOperation *operation, id responseObject) { NSLog(@"JSON: %@", responseObject); } failure:^(AFHTTPRequestOperation *operation, NSError *error) { NSLog(@"Error: %@", error); }];
  17. Notification handler block [[NSNotificationCenter defaultCenter] addObserverForNotificationName:@"NotificationName" object:nil queue:[NSOperationQueue mainQueue] block:^(NSNotification

    *notification) { //reload the table to show the new whiz bangs NSAssert(notification, @"Notification must not be nil"); [self.tableView reloadData]; }];
  18. DSL REQUIRE_STRING(@"90001").to.matchRegExWithPattern(@"^[0-9][0-9][0-9][0-9][0- 9]$").with.message(@"Value must be US zip code format"), [view1

    mas_makeConstraints:^(MASConstraintMaker *make) { make.edges.equalTo(superview).with.insets(padding); }];
  19. DSL - (FTGStringRule * (^)(NSString *anotherValue))equalTo { return ^(NSString *anotherValue){

    [self setValidation:^BOOL(NSString *value) { return [value isEqualToString:anotherValue]; }]; return self; }; }
  20. Condition http://blog.vikingosegundo.de/2012/10/05/pattern-switch-value-object/ NSArray *filter = @[caseYES, caseNO]; id obj1 =

    @"YES"; id obj2 = @"NO"; [obj1 processByPerformingFilterBlocks:filter]; [obj2 processByPerformingFilterBlocks:filter];
  21. Mapping with block http://www.merowing.info/2014/03/refactoring-tricks/#.VNw2IlOUc8Y NSString *(^const format)(NSUInteger, NSString *, NSString

    *) = ^(NSUInteger value, NSString *singular, NSString *plural) { return [NSString stringWithFormat:@"%d %@", value, (value == 1 ? singular : plural)]; };
  22. Reference 1. http://www.galloway.me.uk/2012/10/a-look-inside-blocks-episode-1/ 2. https://blackpixel.com/writing/2014/03/capturing-myself.html 3. http://albertodebortoli.github.io/blog/2013/04/21/objective-c-blocks- under-the-hood/ 4. http://stackoverflow.com/questions/20134616/how-are-nsblock-objects-

    created 5. http://nilsou.com/blog/2013/08/21/objective-c-blocks-syntax/ 6. http://clang.llvm.org/docs/Block-ABI-Apple.html#blocks-as-objects 7. http://albertodebortoli.github.io/blog/2013/08/03/objective-c-blocks- caveat/