рдСрдмреНрдЬреЗрдХреНрдЯрд┐рд╡-рд╕реА рдмреНрд▓реЙрдХ рдФрд░ рд╕реА ++ рд▓рдВрдмрджрд╛

рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдпрд╣ рдкреЛрд╕реНрдЯ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧреА рдЬреЛ C ++ рд▓реИрдВрдмрдбреИрд╕ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реИрдВ, рд▓реЗрдХрд┐рди рдСрдмреНрдЬреЗрдХреНрдЯрд┐рд╡-рд╕реА рдмреНрд▓реЙрдХ рд╕реАрдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрддред
рдпрд╣рд╛рдБ рдореИрдВрдиреЗ рдХреНрд▓реЛрдЬрд╝рд░ рдХреЗ рд╕рд┐рдВрдЯреИрдХреНрд╕, рд╕рдВрджрд░реНрдн рдХреЛ рдХреИрдкреНрдЪрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддрдВрддреНрд░, рдореЗрдореЛрд░реА рдореИрдиреЗрдЬрдореЗрдВрдЯ рдФрд░ рд▓реИрдореНрдмреНрдбрд╛ рдХреА рдмрд╛рддрдЪреАрдд рдФрд░ рдПрдХ-рджреВрд╕рд░реЗ рдХреЛ рдмреНрд▓реЙрдХ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреАред
рд╕рднреА рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ Apple LLVM рдХрдВрдкрд╛рдЗрд▓рд░ 4.2 (рдХреНрд▓реИрдВрдЧ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдУрдЖрд░рдЬреА-рд╕реА рдХреЛрдб рдХреЗ рд▓рд┐рдП рдПрдЖрд░рд╕реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдореЗрд░реА рд░рд╛рдп рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдпрд╣ рдЬрд╛рдирдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ рдХрд┐ рдПрдЖрд░рд╕реА рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдЧреИрд░-рдПрдЖрд░рд╕реА рдХреЛрдб рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рд╕реЗрдХреНрд╢рди:


  1. рд╡рд╛рдХреНрдп-рд╡рд┐рдиреНрдпрд╛рд╕
  2. рдкреНрд░рд╕рдВрдЧ рдХреИрдкреНрдЪрд░
  3. рдореЗрдореЛрд░реА рдкреНрд░рдмрдВрдзрди
  4. рдЙрджреНрджреЗрд╢реНрдп-рд╕реА ++

рдСрдмреНрдЬреЗрдХреНрдЯрд┐рд╡-рд╕реА рдореЗрдВ рдмреНрд▓реЙрдХ рдХреНрд▓реЛрдЬрд░ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИрдВ [2] ред рдмреНрд▓реЙрдХ рдЕрдирд╛рдо рдлрд╝рдВрдХреНрд╢рди рд╣реИрдВ рдЬреЛ рд╕рдВрджрд░реНрдн (рд╡рд░реНрддрдорд╛рди рд╕реНрдЯреИрдХ рдЪрд░ рдФрд░ рд╡рд░реНрдЧ рд╕рджрд╕реНрдп рдЪрд░) рдкрд░ рдХрдмреНрдЬрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд░рдирдЯрд╛рдЗрдо рдкрд░ рдмреНрд▓реЙрдХ рд╡рд╕реНрддреБрдУрдВ рджреНрд╡рд╛рд░рд╛ рджрд░реНрд╢рд╛рдП рдЬрд╛рддреЗ рд╣реИрдВ; рд╡реЗ C ++ рдореЗрдВ рд▓реИрдореНрдмреНрдбрд╛ рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рдХреЗ рдПрдирд╛рд▓реЙрдЧ рд╣реИрдВред

C ++ рдореЗрдВ рд▓реИрдореНрдмреНрдбрд╛ рднреА рдХреНрд▓реЛрдЬрд░ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдФрд░ рдЕрдирд╛рдо рд╕реНрдерд╛рдиреАрдп рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддреЗ рд╣реИрдВред

рд╡рд╛рдХреНрдп-рд╡рд┐рдиреНрдпрд╛рд╕



рдУрдмреНрдЬ-рд╕реА рдмреНрд▓реЙрдХ

[3]

рдкрд╛рда рдХреЗ рд░реВрдк рдореЗрдВ
int multiplier = 7; int (^myBlock)(int) = ^(int num) { return num * multiplier;}; NSLog(@тАЭ%dтАЭ, myBlock(4)); //  28 

  • ^ - рдпрд╣ рдкреНрд░рддреАрдХ рд╕рдВрдХрд▓рдХ рдХреЛ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рдЪрд░ рдПрдХ рдмреНрд▓реЙрдХ рд╣реИ
  • int - рдмреНрд▓реЙрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ int, рдФрд░ рдкреНрд░рдХрд╛рд░ int рдХреЗ рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рд▓реМрдЯрд╛рддрд╛ рд╣реИ
  • рдЧреБрдгрдХ - рдПрдХ рдЪрд░ рдЬреЛ рд╕рдВрджрд░реНрдн рд╕реЗ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЖрддрд╛ рд╣реИ (рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ "рд╕рдВрджрд░реНрдн рдХреИрдкреНрдЪрд░ рдХрд░рдирд╛")


рдмреНрд▓реЙрдХ рдореЗрдВ рд╕реВрдЪрдХ рд╢рдмреНрджрд╛рд░реНрде рд╣реИрдВред
рдСрдмреНрдЬреЗрдХреНрдЯрд┐рд╡-рд╕реА рдореЗрдВ рдмреНрд▓реЙрдХ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдорд╛рдирдХ рдлреНрд░реЗрдорд╡рд░реНрдХ (рдлрд╛рдЙрдВрдбреЗрд╢рди, рдпреВрдЖрдИрдХрд┐рдЯ) рдФрд░ рддреАрд╕рд░реЗ рдкрдХреНрд╖ рдХреЗ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ ( рдПрдПрдлрдПрди рдиреЗрдЯрд╡рд░реНрдХрд┐рдВрдЧ , рдмреНрд▓реЙрдХрд╕рд┐рдЯ ) рджреЛрдиреЛрдВ рдореЗрдВ рдЕрдкрдиреЗ рдЖрд╡реЗрджрди рдХреЛ рдордЬрдмреВрддреА рд╕реЗ рдкрд╛ рдЪреБрдХреЗ рд╣реИрдВред
рд╣рдо рдПрдХ рд╡рд░реНрдЧ рд╢реНрд░реЗрдгреА NSArray рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рдЙрджрд╛рд╣рд░рдг рджреЗрддреЗ рд╣реИрдВ

NSArray рдореЗрдВ рдмреНрд▓реЙрдХ рдЙрдкрдпреЛрдЧ рдЙрджрд╛рд╣рд░рдг
 //   @implementation NSArray (Blocks) //   ,     - (NSArray*)subarrayWithPredicate:(BOOL(^)(id object, NSUInteger idx, BOOL *stop))predicte { NSMutableArray *resultArray = [NSMutableArray array]; BOOL shouldStop = NO; for (id object in self) { if (predicte(object, [self indexOfObjectIdenticalTo:object], &shouldStop)) { [resultArray addObject:object]; } if (shouldStop) { break; } } return [[resultArray copy] autorelease]; } @end // -    NSArray *numbers = @[@(5), @(3), @(8), @(9), @(2)]; NSUInteger divisor = 3; NSArray *divisibleArray = [numbers subarrayWithPredicate:^BOOL(id object, NSUInteger idx, BOOL *stop) { BOOL shouldAdd = NO; //     3 NSAssert([object isKindOfClass:[NSNumber class]], @"object != number"); //  ,   divisor     if ([(NSNumber *)object intValue] % divisor == 0) { shouldAdd = YES; } return shouldAdd; }]; NSLog(@"%@", divisibleArray); //  3, 9 


рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╡реЗ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд▓рд┐рдП рдорд╣рд╛рди рд╣реИрдВ, рдЖрдк AFNetworking рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕реЗ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдЬреАрд╕реАрдбреА рдореЗрдВ рдЙрдирдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдПрдХ рдЦреБрд╢реА рд╣реИред
рд╣рдо рдЕрдкрдиреЗ рдмреНрд▓реЙрдХ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:

рдмреНрд▓реЙрдХ рдкреНрд░рдХрд╛рд░ рдХреА рдШреЛрд╖рдгрд╛
 typedef int (^MyBlockType)(int number, id object); 


C ++ рд▓рдВрдмреЛрджрд░

рд╡рд╣реА рд▓реИрдореНрдмреНрдбрд╛ рдХреЛрдб
[11]
рдкрд╛рда рдХреЗ рд░реВрдк рдореЗрдВ
 int multiplier = 7; auto lambda = [&multiplier](int num) throw() -> int { return multiplier * num; }; lambda(4); //  28 

  • [] - рд▓реИрдореНрдмрдбрд╛ рдШреЛрд╖рдгрд╛ рдХреА рд╢реБрд░реБрдЖрдд, рдЕрдВрджрд░ - рд╕рдВрджрд░реНрдн рдкрд░ рдХрдмреНрдЬрд╛
  • &multiplier - рдХреИрдкреНрдЪрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдЪрд░ ( & рд╕рдВрджрд░реНрдн рджреНрд╡рд╛рд░рд╛ рдХреИрдкреНрдЪрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╕рд╛рдзрди)
  • int - рдЗрдирдкреБрдЯ рдкреИрд░рд╛рдореАрдЯрд░
  • mutable - рдПрдХ рдХреАрд╡рд░реНрдб рдЬреЛ рдЖрдкрдХреЛ рдореВрд▓реНрдп рджреНрд╡рд╛рд░рд╛ рдХреИрдкреНрдЪрд░ рдХрд┐рдП рдЧрдП рдЪрд░ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ
  • throw() - рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рд▓реИрдореНрдмреНрдбрд╛ рдмрд╛рд╣рд░ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдЕрдкрд╡рд╛рдж рдирд╣реАрдВ рдлреЗрдВрдХрддрд╛ рд╣реИ


рд╣рдо рд▓рдВрдмреЛрджрд░ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗрдЯ рдХрд╛ рдЪрдпрди рдХрд░рдиреЗ рдХрд╛ рдПрдХ рд╕рдорд╛рди рдЙрджрд╛рд╣рд░рдг рджреЗрддреЗ рд╣реИрдВ

рдПрдХ рд╡рд┐рдзреЗрдп рд╕рдВрдЧреНрд░рд╣ рд╕реЗ рдПрдХ рд╕рдмрд╕реЗрдЯ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ
 template<class InputCollection, class UnaryPredicate> void subset(InputCollection& inputCollection, InputCollection& outputCollection, UnaryPredicate predicate) { typename InputCollection::iterator iterator = inputCollection.begin(); for (;iterator != inputCollection.end(); ++iterator) { if (predicate(*iterator)) { outputCollection.push_back(*iterator); } } return; } int main(int argc, const char * argv[]) { int divisor = 3; std::vector<int> inputVector = {5, 3, 8, 9, 2}; std::vector<int> outputVector; subset(inputVector, outputVector, [divisor](int number){return number % divisor == 0;}); //     std::for_each( outputVector.begin(), outputVector.end(), [](const int& number){std::cout << number << std::endl;} ); } 



рдкреНрд░рд╕рдВрдЧ рдХреИрдкреНрдЪрд░


рдУрдмреНрдЬ-рд╕реА рдмреНрд▓реЙрдХ

рдпрджрд┐ рд╣рдо рдЙрдиреНрд╣реЗрдВ рдирд╣реАрдВ рдмрджрд▓рддреЗ рд╣реИрдВ рддреЛ рд╣рдо рдмреНрд▓реЙрдХ рдореЗрдВ рд╕реНрдЯреИрдХ рд╡реЗрд░рд┐рдПрдмрд▓реНрд╕ рдХреЗ рдореВрд▓реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЙрдкрд░реЛрдХреНрдд рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╣рдордиреЗ рдмреНрд▓реЙрдХ рдШреЛрд╖рдгрд╛ рдореЗрдВ рдпрд╣ рд╕рдВрдХреЗрдд рдирд╣реАрдВ рджрд┐рдпрд╛ рдерд╛ рдХрд┐ рд╣рдо multiplier рдЪрд░ (рд▓рд╛рдВрдмрд╛ рдХреЗ рд╡рд┐рдкрд░реАрдд, рд▓реИрдореНрдмреНрдбрд╛ рдореЗрдВ) рд╣рдо рдкреВрд░реЗ рд╕рдВрджрд░реНрдн рдХреЛ рдкрдХрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рд┐рдВрдХ рджреНрд╡рд╛рд░рд╛, рдпрд╛ [=] рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ [&] рдореВрд▓реНрдп рд╕реЗ)ред
рд╣рдордиреЗ рдХреЗрд╡рд▓ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╢рд░реАрд░ рдореЗрдВ рдШреЛрд╖рд┐рдд рдирд╛рдо рд╕реЗ рдЗрд╕рдХрд╛ рдореВрд▓реНрдп рд▓рд┐рдпрд╛ред рдпрджрд┐ рд╣рдо рдмреНрд▓реЙрдХ рдХреЗ рд╢рд░реАрд░ рдореЗрдВ рдЗрд╕рдХреЗ рдореВрд▓реНрдп рдХреЛ рдмрджрд▓рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ __block рд╕рдВрд╢реЛрдзрдХ рдХреЗ рд╕рд╛рде рдЪрд░ рдХреЛ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛

рд╕рдВрджрд░реНрдн рд╕реЗ рдкрд░рд┐рд╡рд░реНрддрдирд╢реАрд▓ рдореВрд▓реНрдп рдХреЛ рдмрджрд▓рдиреЗ рдХрд╛ рдЙрджрд╛рд╣рд░рдг
 __block int first = 7; void (^myBlock2)(int) = ^(int second) { first += second;}; myBlock2(4); NSLog(@"%d", first); //  11 


рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдореИрд╕реЗрдЬ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП, рдЬрд┐рд╕ рдкреЙрдЗрдВрдЯрд░ рдХреЛ рд╣рдо рдмреНрд▓реЙрдХ рдореЗрдВ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рд╡рд╣рд╛рдБ рдкреЙрдЗрдВрдЯрд░ рдХреЛ __block рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рдиреЗ рдХреА рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рджрд░рдЕрд╕рд▓, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЬрдм рд╣рдо рдХрд┐рд╕реА рд╡рд╕реНрддреБ рдХреЛ рд╕рдВрджреЗрд╢ рднреЗрдЬрддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдЙрд╕рдХреЗ рд╕реВрдЪрдХ рдХреЛ рдирд╣реАрдВ рдмрджрд▓рддреЗ рд╣реИрдВред

рдХрд┐рд╕реА рд╡рд╕реНрддреБ рдХреЛ рд╕рдВрджрд░реНрдн рд╕реЗ рд╕рдВрджреЗрд╢ рднреЗрдЬрдиреЗ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг
 NSMutableArray *array = [NSMutableArray array]; void (^myBlock3)() = ^() { [array addObject:@"someString"];}; myBlock3(); //  someString  array 


рд▓реЗрдХрд┐рди рдХрднреА-рдХрднреА, рдлрд┐рд░ рднреА, рдореЗрдореЛрд░реА рд▓реАрдХ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП, __block рд╕рд╛рде рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╕реВрдЪрдХ рдХреЛ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред ("рдореЗрдореЛрд░реА рдореИрдиреЗрдЬрдореЗрдВрдЯ" рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рдЗрд╕ рдкрд░ рдЕрдзрд┐рдХ)

C ++ рд▓рдВрдмреЛрджрд░

рдкрдХрдбрд╝реЗ рдЧрдП рдЪрд░ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕реНрдерд╛рди [5] рдореЗрдВ рдЗрдВрдЧрд┐рдд рдХрд┐рдП рдЧрдП рд╣реИрдВ, рдЕрд░реНрдерд╛рддреН рд╡рд░реНрдЧ рдХреЛрд╖реНрдардХ рдХреЗ рдЕрдВрджрд░ []

рдЙрддреНрдкрд░рд┐рд╡рд░реНрддреА рд╕рдВрджрд░реНрдн рдкрд░ рдХрдмреНрдЬрд╛ рдХрд░рдиреЗ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИ, рдпрд╣ рдХрд╣рддрд╛ рд╣реИ рдХрд┐
рдХрд┐ рдЖрдк рдореВрд▓реНрдп рджреНрд╡рд╛рд░рд╛ рдкрд╛рд░рд┐рдд рдЪрд░ рдХреА рдкреНрд░рддрд┐рдпрд╛рдВ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВред рдЕрдЧрд▓реЗ рднрд╛рдЧ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реАред


рдореЗрдореЛрд░реА рдкреНрд░рдмрдВрдзрди


рдУрдмреНрдЬ-рд╕реА рдмреНрд▓реЙрдХ

рдмреНрд▓реЙрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реИрдВ, рдЙрдиреНрд╣реЗрдВ рд╕реНрдЯреИрдХ рдкрд░ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдмрд╛рдж рдореЗрдВ рдЙрдиреНрд╣реЗрдВ рдвреЗрд░ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ)
рдмреНрд▓реЙрдХ 3 рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди [7] рдХреЗ рд░реВрдк рдореЗрдВ рдореМрдЬреВрдж рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред

  1. рдЬрдм рд╣рдо рдмреНрд▓реЙрдХ рдХреЗ рдЕрдВрджрд░ рд╕рдВрджрд░реНрдн (рд╕реНрдЯреИрдХ рд╕реЗ) рд╕реЗ рдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ NSGlobalBlock рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдПрдХ рд╕рд┐рдВрдЧрд▓рдЯрди рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
  2. рдпрджрд┐ рд╣рдо рд╕рдВрджрд░реНрдн рдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ NSStackBlock рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдЕрдм рдПрдХ рд╕рд┐рдВрдЧрд▓рдЯрди рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рд╕реНрдЯреИрдХ рдкрд░ рд╕реНрдерд┐рдд рд╣реИред
  3. рдпрджрд┐ рд╣рдо Block_copy рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдпрд╛ рд╣рдо рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рд╣рдорд╛рд░рд╛ рдмреНрд▓реЙрдХ рдХрд┐рд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдЕрдВрджрд░ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рдП, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдкреНрд░реЙрдкрд░реНрдЯреА рдХреЗ рд░реВрдк рдореЗрдВ: @property (nonatomic, copy) MyBlockType myBlock; рддрдм NSMallocBlock рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ NSMallocBlock , рдЬреЛ рд╕рдВрджрд░реНрдн рдореЗрдВ рдкрд╛рд╕ рдХреА рдЧрдИ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдХреИрдкреНрдЪрд░ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдорд╛рд╕реНрдЯрд░реНрд╕ (рд╕реНрд╡рд╛рдореА == NSMallocBlock ) рднреЗрдЬрддрд╛ рд╣реИред рдпрд╣ рдПрдХ рдмрд╣реБрдд рд╣реА рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╕рдВрдкрддреНрддрд┐ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рджреЗрдЦрднрд╛рд▓ рдХреЗ рд╕рд╛рде рд╕рдВрднрд╛рд▓рд╛ рдЬрд╛рдиреЗ рдкрд░ рдореЗрдореЛрд░реА рд▓реАрдХ рд╣реЛ рд╕рдХрддреА рд╣реИред рдмреНрд▓реЙрдХ рдмрдирд╛рдП рд░рдЦрдиреЗ рдХреЗ рдЪрдХреНрд░ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рднреА рдзреНрдпрд╛рди рд░рдЦрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рдЕрдЧрд░ рд╣рдо NSMallocBlock рдореЗрдВ property рдХреЗ рдореВрд▓реНрдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ property , рддреЛ рдпрд╣ рд╕рдВрдкрддреНрддрд┐ рд╣реА рдирд╣реАрдВ рд╣реЛрдЧреА рдЬреЛ рдХрд┐ рдмрд░рдХрд░рд╛рд░ рд░рд╣реЗрдЧреА, рд▓реЗрдХрд┐рди рд╡рд╣ рд╡рд╕реНрддреБ рдЬрд┐рд╕рдХреЗ рдкрд╛рд╕ рд╕рдВрдкрддреНрддрд┐ рд╣реИред


рдпрд╣рд╛рдБ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╕реНрд╡рд╛рдорд┐рддреНрд╡ рдЪрдХреНрд░ рд╣реИ:
рдорд╛рди рд▓реЗрдВ рдХрд┐ рдЖрдк рдПрдХ рд╡рд░реНрдЧ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ API PKHTTPReuquest рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ API PKHTTPReuquest рд╕рд╛рде рдПрдХ HTTP рдЕрдиреБрд░реЛрдз рдХрд░рддрд╛ API PKHTTPReuquest

PKHTTPReuquest рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди
 typedef void (^PKHTTPRequestCompletionSuccessBlock)(NSString *responseString); typedef void (^PKHTTPRequestCompletionFailBlock)(NSError* error); @protocol PKRequest <NSObject> - (void)startRequest; @end @interface PKHTTPRequest : NSObject <PKRequest> // designated initializer - (id)initWithURL:(NSURL *)url successBlock:(PKHTTPRequestCompletionSuccessBlock)success failBlock:(PKHTTPRequestCompletionFailBlock)fail; @end 

 @interface PKHTTPRequest () <NSURLConnectionDelegate> @property (nonatomic, copy) PKHTTPRequestCompletionSuccessBlock succesBlock; @property (nonatomic, copy) PKHTTPRequestCompletionFailBlock failBlock; @property (nonatomic, retain) NSURL *url; @property (nonatomic, retain) NSURLConnection *connection; @property (nonatomic, retain) NSMutableData *data; @end @implementation PKHTTPRequest #pragma mark - initialization / deallocation // designated initializer - (id)initWithURL:(NSURL *)url successBlock:(PKHTTPRequestCompletionSuccessBlock)success failBlock:(PKHTTPRequestCompletionFailBlock)fail { self = [super init]; if (self != nil) { self.succesBlock = success; self.failBlock = fail; self.url = url; NSURLRequest *request = [NSURLRequest requestWithURL:self.url]; self.connection = [[[NSURLConnection alloc] initWithRequest:request delegate:self startImmediately:NO] autorelease]; } return self; } - (id)init { NSAssert(NO, @"Use desiganted initializer"); return nil; } - (void)dealloc { self.succesBlock = nil; self.failBlock = nil; self.url = nil; self.connection = nil; self.data = nil; [super dealloc]; } #pragma mark - public methods - (void)startRequest { self.data = [NSMutableData data]; [self.connection start]; } #pragma mark - NSURLConnectionDelegate implementation - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { [self.data appendData:data]; } - (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error { self.failBlock(error); self.data = nil; } - (void)connectionDidFinishLoading:(NSURLConnection *)connection { self.succesBlock([NSString stringWithUTF8String:self.data.bytes]); self.data = nil; } @end 



рдФрд░ рдлрд┐рд░ рдЖрдк рдЕрдкрдиреЗ PKGetUserNameRequest рд╕рд░реНрд╡рд░ рдХреЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ API рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЕрдиреБрд░реЛрдз рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддреЗ рдереЗ рдЬреЛ PKHTTPReuquest рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ

PKGetUserNameRequest рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди
 typedef void (^PKGetUserNameRequestCompletionSuccessBlock)(NSString *userName); typedef void (^PKGetUserNameRequestCompletionFailBlock)(NSError* error); @interface PKGetUserNameRequest : NSObject <PKRequest> - (id)initWithUserID:(NSString *)userID successBlock:(PKGetUserNameRequestCompletionSuccessBlock)success failBlock:(PKGetUserNameRequestCompletionFailBlock)fail; @end 


 NSString *kApiHost = @"http://someApiHost.com"; NSString *kUserNameApiKey = @"username"; @interface PKGetUserNameRequest () @property (nonatomic, retain) PKHTTPRequest *httpRequest; - (NSString *)parseResponse:(NSString *)response; @end @implementation PKGetUserNameRequest #pragma mark - initialization / deallocation - (id)initWithUserID:(NSString *)userID successBlock:(PKGetUserNameRequestCompletionSuccessBlock)success failBlock:(PKGetUserNameRequestCompletionFailBlock)fail { self = [super init]; if (self != nil) { NSString *requestString = [kApiHost stringByAppendingFormat:@"?%@=%@", kUserNameApiKey, userID]; self.httpRequest = [[[PKHTTPRequest alloc] initWithURL:[NSURL URLWithString:requestString] successBlock:^(NSString *responseString) { //   -   self NSString *userName = [self parseResponse:responseString]; success(userName); } failBlock:^(NSError *error) { fail(error); } ] autorelease]; } return self; } - (id)init { NSAssert(NO, @"Use desiganted initializer"); return nil; } - (void)dealloc { self.httpRequest = nil; [super dealloc]; } #pragma mark - public methods - (void)startRequest { [self.httpRequest startRequest]; } #pragma mark - private methods - (NSString *)parseResponse:(NSString *)response { /* ...... */ return userName; } @end 



рдЗрд╕ рдкрдВрдХреНрддрд┐ рдореЗрдВ рддреНрд░реБрдЯрд┐ NSString *userName = [self parseResponse:responseString]; - рдЬрдм рд╣рдо рдорд▓реНрд▓реЛрдХ рдмреНрд▓реЙрдХ рдореЗрдВ рд╕реНрд╡рдпрдВ рдкрд░ рдХреБрдЫ рдХрд╣рддреЗ рд╣реИрдВ, рд╕реЗрд▓реНрдл рд░рд┐рдЯрди, рд╕реНрд╡рд╛рдорд┐рддреНрд╡ рдЧреНрд░рд╛рдл рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд▓реВрдк рдмрдирд╛рддреЗ рд╣реИрдВ:



рдЖрдк рдЗрд╕ рддрд░рд╣ рд╕реЗ __block рд╕рдВрд╢реЛрдзрдХ рдХреЗ рд╕рд╛рде рд╕реНрдЯреИрдХ рдкрд░ рд╕реНрд╡рдпрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдордзреНрдпрд╡рд░реНрддреА рд╕реВрдЪрдХ рдмрдирд╛рдХрд░ рдЗрд╕рд╕реЗ рдмрдЪ рд╕рдХрддреЗ рд╣реИрдВ:

рдПрдХ рдХрд╛рд░реНрдпрдХрд╛рд▓ рдЪрдХреНрд░ рдХреЛ рддреЛрдбрд╝рдиреЗ рдХрд╛ рдЙрджрд╛рд╣рд░рдг
 //    __block PKGetUserNameRequest *selfRequest = self; self.httpRequest = [[[PKHTTPRequest alloc] initWithURL:[NSURL URLWithString:requestString] successBlock:^(NSString *responseString) { NSString *userName = [selfRequest parseResponse:responseString]; success(userName); } failBlock:^(NSError *error) { fail(error); } ] autorelease]; 


рдпрд╛, рдЖрдк рдЖрд░рдВрднреАрдХрд░рдг рд╡рд┐рдзрд┐ рдХреЗ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рд╕реЗ рдмреНрд▓реЙрдХ рдХреЛ рдЖрд░рдВрднрд┐рдХ рд╡рд┐рдзрд┐ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ,
startRequestwithCompaltion:fail: рдФрд░ рдХреЗрд╡рд▓ рдЕрдиреБрд░реЛрдз рдХреА рдЕрд╡рдзрд┐ рдХреЗ рд▓рд┐рдП рдмреНрд▓реЙрдХ рдмрдирд╛рдП рд░рдЦреЗрдВред рддрдм рдпрд╣ __block рд╕рдВрд╢реЛрдзрдХ рдХреЗ рдмрд┐рдирд╛ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛ред рдпрд╣ рдПрдХ рдЕрдиреНрдп рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░реЗрдЧрд╛: рдЙрдкрд░реЛрдХреНрдд рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдПрдХ рдЦрддрд░рд╛ рд╣реИ рдХрд┐ рдЬрдм рддрдХ рдмреНрд▓реЙрдХ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ (рддрдм рддрдХ рдЬрдм рдЕрдиреБрд░реЛрдз рдкреВрд░рд╛ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ), рддрдм рддрдХ PKGetUserNameRequest рдкреНрд░рдХрд╛рд░ рдХреА рдПрдХ рд╡рд╕реНрддреБ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЕрд╕реНрддрд┐рддреНрд╡ рдореЗрдВ рд░рд╣реЗрдЧреА (рдбреАрд▓реЙрдХ рд╡рд┐рдзрд┐ рдХрд╣рд╛ рдЬрд╛рдПрдЧрд╛), рдХреНрдпреЛрдВрдХрд┐ рдмреНрд▓реЙрдХ рдХрдордЬреЛрд░ рд╕рдВрдЪрд╛рд░ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдФрд░ selfRequest рд╕реВрдЪрдХ рдкрд░ selfRequest , рдЬрд┐рд╕рд╕реЗ рджреБрд░реНрдШрдЯрдирд╛ рд╣реЛрдЧреАред

рд╣рдо рдмреНрд▓реЙрдХреЛрдВ рдХреЗ рд╕рд╛рде рдЧрд▓рдд рд╕реНрдореГрддрд┐ рдкреНрд░рдмрдВрдзрди рдХрд╛ рдПрдХ рдФрд░ рдЙрджрд╛рд╣рд░рдг рджреЗрддреЗ рд╣реИрдВ, рд╡реАрдбрд┐рдпреЛ рд╡реНрдпрд╛рдЦреНрдпрд╛рди рд╕реЗ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг [7]

NSStackBlock рдХреЗ рд╕рд╛рде рддреНрд░реБрдЯрд┐
 void addBlockToArray(NSMutableArray* array) { NSString *string = @"example string"; [array addObject:^{ printf("%@\n", string); }]; } void example() { NSMutableArray *array = [NSMutableArray array]; addBlockToArray(array); void (^block)() = [array objectAtIndex:0]; block(); } 


рдпрджрд┐ рд╣рдо рдмреНрд▓реЙрдХ рдХреЛ рдПрдХ рдвреЗрд░ рдореЗрдВ рдХреЙрдкреА рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд╕реНрдЯреИрдХ рдХреЛ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдПрдХ рддреНрд░реБрдЯрд┐ рдирд╣реАрдВ рд╣реБрдИ рд╣реЛрдЧреАред
рд╕рд╛рде рд╣реА, рдпрд╣ рдЙрджрд╛рд╣рд░рдг ARC рдХреЛрдб рдореЗрдВ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХрд╛ рдХрд╛рд░рдг рдирд╣реАрдВ рд╣реЛрдЧрд╛ред

C ++ рд▓рдВрдмреЛрджрд░

рд░рдирдЯрд╛рдЗрдо рдореЗрдВ рд▓рдВрдмреЛрджрд╛ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡рд┐рднрд┐рдиреНрди рд╕рдВрдХрд▓рдХ рдореЗрдВ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рд╡реЗ рдХрд╣рддреЗ рд╣реИрдВ рдХрд┐ рдореЗрдордиреЛрдВ рдХреЗ рд▓рд┐рдП рд╕реНрдореГрддрд┐ рдкреНрд░рдмрдВрдзрди рдорд╛рдирдХ рдореЗрдВ рдмрд╣реБрдд рд╡рд░реНрдгрд┐рдд рдирд╣реАрдВ рд╣реИред [9]
рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред
C ++ рдореЗрдВ рд▓рдВрдмрджрд╛ рдПрдХ рдЕрдЬреНрдЮрд╛рдд рдкреНрд░рдХрд╛рд░ рдХреА рд╡рд╕реНрддреБрдПрдВ рд╣реИрдВ рдЬреЛ рд╕реНрдЯреИрдХ рдкрд░ рдмрдирд╛рдИ рдЬрд╛рддреА рд╣реИрдВред
рд▓реИрдореНрдмреНрдбрд╛ рдЬреЛ рдХрд┐рд╕реА рднреА рд╕рдВрджрд░реНрдн рдХреЛ рдХреИрдкреНрдЪрд░ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рдЙрдиреНрд╣реЗрдВ рдлрд╝рдВрдХреНрд╢рди рдкреЙрдЗрдВрдЯрд░ рдореЗрдВ рдбрд╛рд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╡реЗ рдХреЗрд╡рд▓ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рд╕рдВрдХреЗрдд рд╣реИрдВред рдПрдХ рд▓рдВрдмреЛрджрд░ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд╡рд╕реНрддреБ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдПрдХ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдФрд░ рдПрдХ рд╡рд┐рдзреНрд╡рдВрд╕рдХ рд╣реИ, рдЬреЛ рд╕реНрдЯреИрдХ рдкрд░ рдЦрдбрд╝рд╛ рд╣реИред

рдпрд╣рд╛рдВ рдвреЗрд░ рдореЗрдВ рдмрдврд╝рддреЗ рд▓рдВрдмреЛрджрд░ рдХреЗ рдХреБрдЫ рдЙрджрд╛рд╣рд░рдг рджрд┐рдП рдЧрдП рд╣реИрдВ
рдвреЗрд░ рдореЗрдВ рдПрдХ рдореЗрдордиреЗ рдХреЛ рд╣рд┐рд▓рд╛рдиреЗ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг
 //  тДЦ1 auto lamb = []() {return 5;}; auto func_lamb_ptr = new std::function<int()>(lamb); //  тДЦ2: auto lamb = []() {return 5;}; auto* p = new decltype(lamb)(lamb); //  тДЦ3: template <typename T> T* heap_alloc(T const& value) { return new T(value); } auto* p = heap_alloc([]() {return 5;}); //  тДЦ4: std::vector<decltype(lamb)> v; v.push_back(lamb); 


рдЕрдм рдЖрдк рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХрд┐рд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд╕рджрд╕реНрдп рдЪрд░ рдореЗрдВ рдкрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рд▓реИрдореНрдмреНрдбрд╛ рддрд░реНрдХреЛрдВ рдХреА рдШреЛрд╖рдгрд╛ рдХреЗ рдмрд╛рдж рдЙрддреНрдкрд░рд┐рд╡рд░реНрддрд┐рдд , рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЖрдк рдореВрд▓реНрдп рджреНрд╡рд╛рд░рд╛ рдХреИрдкреНрдЪрд░ рдХреА рдЧрдИ рдЪрд░ рдХреА рдкреНрд░рддрд┐рдпреЛрдВ рдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреЛ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ (рдореВрд▓ рдЪрд░ рдХрд╛ рдореВрд▓реНрдп рдирд╣реАрдВ рдмрджрд▓реЗрдЧрд╛)ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рд╣рдордиреЗ рдПрдХ рд▓реИрдореНрдмреНрдбрд╛ рдХреЛ рдЗрд╕ рддрд░рд╣ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рд╣реИ: auto lambda = [multiplier](int num) throw() mutable рд╣рдо рд▓реИрдореНрдмреНрдбрд╛ рдХреЗ рдЕрдВрджрд░ multiplier рдорд╛рди рдХреЛ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдШреЛрд╖рд┐рдд рдЧреБрдгрдХ рдХреЛ рдирд╣реАрдВ рдмрджрд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдкрд░рд┐рд╡рд░реНрддрд┐рдд multiplier рдорд╛рди рдХреЛ рдХреЙрд▓ рд╕реЗ рдЗрд╕ рд▓рдВрдмреЛ рдЗрдВрд╕реНрдЯреЗрдВрд╕ рдХреЗ рдХреЙрд▓ рд╕реЗ рдмрдЪрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЖрдк рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдХрд▓реНрдкрдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: рдПрдХ рд▓реИрдореНрдмреНрдбрд╛ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ (рдХрд┐рд╕реА рд╡рд╕реНрддреБ рдореЗрдВ) рдЪрд░ рд╕рджрд╕реНрдпреЛрдВ рдХреЛ рдкрд╛рд░рд┐рдд рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рдЕрдиреБрд░реВрдк рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╣рдореЗрдВ рдпрд╣рд╛рдВ рд╕рд╛рд╡рдзрд╛рди рд░рд╣рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЕрдЧрд░ рд╣рдо рдПрдХ рд▓рдВрдмреЛ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреА рдирдХрд▓ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЙрд╕реЗ рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпреЗ рд╕рджрд╕реНрдп рдЪрд░ рдореВрд▓ рд▓реИрдореНрдмреНрдбрд╛ рдореЗрдВ рдирд╣реАрдВ рдмрджрд▓реЗрдВрдЧреЗ, рд╡реЗ рдХреЗрд╡рд▓ рдХреЙрдкреА рдХрд┐рдП рдЧрдП рдПрдХ рдореЗрдВ рдмрджрд▓ рдЬрд╛рдПрдВрдЧреЗред рдХрднреА-рдХрднреА рдЖрдкрдХреЛ std::ref рдореЗрдВ рд▓рд┐рдкрдЯреЗ lambdas рдХреЛ рдкрд╛рд╕ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ std::ref ред Obj-C рдмреНрд▓реЙрдХ рдмреЙрдХреНрд╕ рд╕реЗ рдмрд╛рд╣рд░ рдРрд╕рд╛ рдЕрд╡рд╕рд░ рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред


рдЙрджреНрджреЗрд╢реНрдп-рд╕реА ++


рдЪреВрдВрдХрд┐ Objecitve-C ++ рдСрдмреНрдЬреЗрдХреНрдЯрд┐рд╡-C рдФрд░ C ++ рджреЛрдиреЛрдВ рдХреЛ рдЬреЛрдбрд╝рддреА рд╣реИ, рдЖрдк рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рд▓реИрдореНрдмреНрдбрд╛ рдФрд░ рдмреНрд▓реЙрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд▓реИрдореНрдмреНрдбрд╛ рдФрд░ рдмреНрд▓реЙрдХ рдПрдХ рджреВрд╕рд░реЗ рд╕реЗ рдХреИрд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИрдВ?

  1. рд╣рдо рдмреНрд▓реЙрдХ рдХреЛ рдПрдХ рд▓реИрдореНрдмреНрдбрд╛ рдЕрд╕рд╛рдЗрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
    рдЙрджрд╛рд╣рд░рдг
      void (^block_example)(int); auto lambda_example = [](int number){number++; NSLog(@"%d", number);}; block_example = lambda_example; block_example(10); // log 11 


  2. рд╣рдо std :: function рдХреЛ рдПрдХ рдмреНрд▓реЙрдХ рдЕрд╕рд╛рдЗрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ

    рдпрд╣рд╛рдВ рдпрд╣ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рдСрдмреНрдЬреЗрдХреНрдЯрд┐рд╡-рд╕реА рдФрд░ рд╕реА ++ рдореЗрдВ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдореЗрдореЛрд░реА рдореИрдиреЗрдЬрдореЗрдВрдЯ рдкреЙрд▓рд┐рд╕реА рд╣реИрдВ, рдФрд░ std::function рдореЗрдВ рдПрдХ рдмреНрд▓реЙрдХ рд╕реНрдЯреЛрд░ рдХрд░рдиреЗ рд╕реЗ рд▓рд┐рдВрдХрд┐рдВрдЧ рдЦрддрд░реЗ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред

  3. рд╣рдо рд▓реИрдВрдмрдбрд╛ рдмреНрд▓реЙрдХ рдирд╣реАрдВ рджреЗ рд╕рдХрддреЗред

    рд▓реИрдореНрдмреНрдбрд╛ рдореЗрдВ рдХреЙрдкреА-рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдирд╣реАрдВ рд╣реИред рдЗрд╕рд▓рд┐рдП, рд╣рдо рдЗрд╕реЗ рдмреНрд▓реЙрдХ рдпрд╛ рд╕реНрд╡рдпрдВ рднреА рдЕрд╕рд╛рдЗрди рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред
    рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдореЗрдВ рддреНрд░реБрдЯрд┐
     int main() { auto lambda1 = []() -> void { printf("Lambda 1!\n"); }; lambda1 = lambda1; // error: use of deleted function 'main()::<lambda()>& main()::<lambda()>::operator=(const main()::<lambda()>&)' return 0; } 



рдпрд╣ рдХрд╣рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рд▓реИрдореНрдмреНрдбрд╛ рдФрд░ рдмреНрд▓реЙрдХреЛрдВ рдХреЗ рдмреАрдЪ рд╕рдВрдЪрд╛рд▓рди рдХрд╛рдлреА рд╡рд┐рджреЗрд╢реА рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рдРрд╕реЗ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдХрднреА рдирд╣реАрдВ рджреЗрдЦреЗ рд╣реИрдВред

рд╕рдВрдмрдВрдзрд┐рдд рд▓рд┐рдВрдХ


  1. C ++ рд▓реИрдВрдмрдбрд╛рд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ
  2. рд╢реЙрд░реНрдЯ рд╕рд░реНрдХрд┐рдЯ
  3. Apple рдмреНрд▓реЙрдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ
  4. рдЕрдВрдЧреНрд░реЗрдЬреА рдореЗрдВ рд▓реИрдореНрдмреНрдбрд╛ рдФрд░ рдмреНрд▓реЙрдХ рдХреА рддреБрд▓рдирд╛
  5. рдбреЙрдХреНрд╕ рд╕реА ++ рд▓реИрдореНрдмреНрдбрд╛
  6. рдмреНрд▓реЙрдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ
  7. рдмреНрд▓реЙрдХреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╢рд╛рдирджрд╛рд░ рд╡реАрдбрд┐рдпреЛ
  8. Stackoverflow.com рдкрд░ C ++ рд▓реИрдореНрдмреНрдбрд╛ рдореЗрдореЛрд░реА рдХреЗ рдЖрдпреЛрдЬрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкреНрд░рд╢реНрди
  9. рд░рдирдЯрд╛рдЗрдо рдореЗрдВ C ++ рд▓рдВрдмреЛрджрд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкреНрд░рд╢реНрди
  10. рд▓рдВрдмреЛрджрд░ рдФрд░ рдмреНрд▓реЙрдХреЛрдВ рдХреА рдмрд╛рддрдЪреАрдд рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ
  11. рд▓рдВрдмреЛрджрд░ рд╕рд┐рдВрдЯреЗрдХреНрд╕
  12. рдЙрджреНрджреЗрд╢реНрдп-рд╕реА рдФрд░ рд╕реА ++ рдХреА рдмрд╛рддрдЪреАрдд рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ
  13. C ++ рдХреЛ Objective-C рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдПрдореНрдмреЗрдб рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ

Source: https://habr.com/ru/post/In204356/


All Articles