рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдпрд╣ рдкреЛрд╕реНрдЯ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧреА рдЬреЛ C ++ рд▓реИрдВрдмрдбреИрд╕ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реИрдВ, рд▓реЗрдХрд┐рди рдСрдмреНрдЬреЗрдХреНрдЯрд┐рд╡-рд╕реА рдмреНрд▓реЙрдХ рд╕реАрдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрддред
рдпрд╣рд╛рдБ рдореИрдВрдиреЗ рдХреНрд▓реЛрдЬрд╝рд░ рдХреЗ рд╕рд┐рдВрдЯреИрдХреНрд╕, рд╕рдВрджрд░реНрдн рдХреЛ рдХреИрдкреНрдЪрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддрдВрддреНрд░, рдореЗрдореЛрд░реА рдореИрдиреЗрдЬрдореЗрдВрдЯ рдФрд░ рд▓реИрдореНрдмреНрдбрд╛ рдХреА рдмрд╛рддрдЪреАрдд рдФрд░ рдПрдХ-рджреВрд╕рд░реЗ рдХреЛ рдмреНрд▓реЙрдХ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреАред
рд╕рднреА рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ Apple LLVM рдХрдВрдкрд╛рдЗрд▓рд░ 4.2 (рдХреНрд▓реИрдВрдЧ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдУрдЖрд░рдЬреА-рд╕реА рдХреЛрдб рдХреЗ рд▓рд┐рдП рдПрдЖрд░рд╕реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдореЗрд░реА рд░рд╛рдп рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдпрд╣ рдЬрд╛рдирдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ рдХрд┐ рдПрдЖрд░рд╕реА рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдЧреИрд░-рдПрдЖрд░рд╕реА рдХреЛрдб рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
рд╕реЗрдХреНрд╢рди:
- рд╡рд╛рдХреНрдп-рд╡рд┐рдиреНрдпрд╛рд╕
- рдкреНрд░рд╕рдВрдЧ рдХреИрдкреНрдЪрд░
- рдореЗрдореЛрд░реА рдкреНрд░рдмрдВрдзрди
- рдЙрджреНрджреЗрд╢реНрдп-рд╕реА ++
рдСрдмреНрдЬреЗрдХреНрдЯрд┐рд╡-рд╕реА рдореЗрдВ рдмреНрд▓реЙрдХ рдХреНрд▓реЛрдЬрд░ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИрдВ
[2] ред рдмреНрд▓реЙрдХ рдЕрдирд╛рдо рдлрд╝рдВрдХреНрд╢рди рд╣реИрдВ рдЬреЛ рд╕рдВрджрд░реНрдн (рд╡рд░реНрддрдорд╛рди рд╕реНрдЯреИрдХ рдЪрд░ рдФрд░ рд╡рд░реНрдЧ рд╕рджрд╕реНрдп рдЪрд░) рдкрд░ рдХрдмреНрдЬрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд░рдирдЯрд╛рдЗрдо рдкрд░ рдмреНрд▓реЙрдХ рд╡рд╕реНрддреБрдУрдВ рджреНрд╡рд╛рд░рд╛ рджрд░реНрд╢рд╛рдП рдЬрд╛рддреЗ рд╣реИрдВ; рд╡реЗ C ++ рдореЗрдВ рд▓реИрдореНрдмреНрдбрд╛ рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рдХреЗ рдПрдирд╛рд▓реЙрдЧ рд╣реИрдВред
C ++ рдореЗрдВ рд▓реИрдореНрдмреНрдбрд╛ рднреА рдХреНрд▓реЛрдЬрд░ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдФрд░ рдЕрдирд╛рдо рд╕реНрдерд╛рдиреАрдп рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддреЗ рд╣реИрдВред
рд╡рд╛рдХреНрдп-рд╡рд┐рдиреНрдпрд╛рд╕
рдУрдмреНрдЬ-рд╕реА рдмреНрд▓реЙрдХ
[3]рдкрд╛рда рдХреЗ рд░реВрдк рдореЗрдВint multiplier = 7; int (^myBlock)(int) = ^(int num) { return num * multiplier;}; NSLog(@тАЭ%dтАЭ, myBlock(4));
- ^ - рдпрд╣ рдкреНрд░рддреАрдХ рд╕рдВрдХрд▓рдХ рдХреЛ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рдЪрд░ рдПрдХ рдмреНрд▓реЙрдХ рд╣реИ
- int - рдмреНрд▓реЙрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ int, рдФрд░ рдкреНрд░рдХрд╛рд░ int рдХреЗ рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рд▓реМрдЯрд╛рддрд╛ рд╣реИ
- рдЧреБрдгрдХ - рдПрдХ рдЪрд░ рдЬреЛ рд╕рдВрджрд░реНрдн рд╕реЗ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЖрддрд╛ рд╣реИ (рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ "рд╕рдВрджрд░реНрдн рдХреИрдкреНрдЪрд░ рдХрд░рдирд╛")
рдмреНрд▓реЙрдХ рдореЗрдВ рд╕реВрдЪрдХ рд╢рдмреНрджрд╛рд░реНрде рд╣реИрдВред
рдСрдмреНрдЬреЗрдХреНрдЯрд┐рд╡-рд╕реА рдореЗрдВ рдмреНрд▓реЙрдХ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдорд╛рдирдХ рдлреНрд░реЗрдорд╡рд░реНрдХ (рдлрд╛рдЙрдВрдбреЗрд╢рди, рдпреВрдЖрдИрдХрд┐рдЯ) рдФрд░ рддреАрд╕рд░реЗ рдкрдХреНрд╖ рдХреЗ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ (
рдПрдПрдлрдПрди рдиреЗрдЯрд╡рд░реНрдХрд┐рдВрдЧ ,
рдмреНрд▓реЙрдХрд╕рд┐рдЯ ) рджреЛрдиреЛрдВ рдореЗрдВ рдЕрдкрдиреЗ рдЖрд╡реЗрджрди рдХреЛ рдордЬрдмреВрддреА рд╕реЗ рдкрд╛ рдЪреБрдХреЗ рд╣реИрдВред
рд╣рдо рдПрдХ рд╡рд░реНрдЧ
рд╢реНрд░реЗрдгреА NSArray рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рдЙрджрд╛рд╣рд░рдг рджреЗрддреЗ рд╣реИрдВ
NSArray рдореЗрдВ рдмреНрд▓реЙрдХ рдЙрдкрдпреЛрдЧ рдЙрджрд╛рд╣рд░рдг рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╡реЗ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд▓рд┐рдП рдорд╣рд╛рди рд╣реИрдВ, рдЖрдк 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);
[]
- рд▓реИрдореНрдмрдбрд╛ рдШреЛрд╖рдгрд╛ рдХреА рд╢реБрд░реБрдЖрдд, рдЕрдВрджрд░ - рд╕рдВрджрд░реНрдн рдкрд░ рдХрдмреНрдЬрд╛&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;});
рдкреНрд░рд╕рдВрдЧ рдХреИрдкреНрдЪрд░
рдУрдмреНрдЬ-рд╕реА рдмреНрд▓реЙрдХ
рдпрджрд┐ рд╣рдо рдЙрдиреНрд╣реЗрдВ рдирд╣реАрдВ рдмрджрд▓рддреЗ рд╣реИрдВ рддреЛ рд╣рдо рдмреНрд▓реЙрдХ рдореЗрдВ рд╕реНрдЯреИрдХ рд╡реЗрд░рд┐рдПрдмрд▓реНрд╕ рдХреЗ рдореВрд▓реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЙрдкрд░реЛрдХреНрдд рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╣рдордиреЗ рдмреНрд▓реЙрдХ рдШреЛрд╖рдгрд╛ рдореЗрдВ рдпрд╣ рд╕рдВрдХреЗрдд рдирд╣реАрдВ рджрд┐рдпрд╛ рдерд╛ рдХрд┐ рд╣рдо
multiplier
рдЪрд░ (рд▓рд╛рдВрдмрд╛ рдХреЗ рд╡рд┐рдкрд░реАрдд, рд▓реИрдореНрдмреНрдбрд╛ рдореЗрдВ) рд╣рдо рдкреВрд░реЗ рд╕рдВрджрд░реНрдн рдХреЛ рдкрдХрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рд┐рдВрдХ рджреНрд╡рд╛рд░рд╛, рдпрд╛
[=]
рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ
[&]
рдореВрд▓реНрдп рд╕реЗ)ред
рд╣рдордиреЗ рдХреЗрд╡рд▓ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╢рд░реАрд░ рдореЗрдВ рдШреЛрд╖рд┐рдд рдирд╛рдо рд╕реЗ рдЗрд╕рдХрд╛ рдореВрд▓реНрдп рд▓рд┐рдпрд╛ред рдпрджрд┐ рд╣рдо рдмреНрд▓реЙрдХ рдХреЗ рд╢рд░реАрд░ рдореЗрдВ рдЗрд╕рдХреЗ рдореВрд▓реНрдп рдХреЛ рдмрджрд▓рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ
__block
рд╕рдВрд╢реЛрдзрдХ рдХреЗ рд╕рд╛рде рдЪрд░ рдХреЛ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛
рд╕рдВрджрд░реНрдн рд╕реЗ рдкрд░рд┐рд╡рд░реНрддрдирд╢реАрд▓ рдореВрд▓реНрдп рдХреЛ рдмрджрд▓рдиреЗ рдХрд╛ рдЙрджрд╛рд╣рд░рдг __block int first = 7; void (^myBlock2)(int) = ^(int second) { first += second;}; myBlock2(4); NSLog(@"%d", first);
рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдореИрд╕реЗрдЬ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП, рдЬрд┐рд╕ рдкреЙрдЗрдВрдЯрд░ рдХреЛ рд╣рдо рдмреНрд▓реЙрдХ рдореЗрдВ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рд╡рд╣рд╛рдБ рдкреЙрдЗрдВрдЯрд░ рдХреЛ
__block
рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рдиреЗ рдХреА рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рджрд░рдЕрд╕рд▓, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЬрдм рд╣рдо рдХрд┐рд╕реА рд╡рд╕реНрддреБ рдХреЛ рд╕рдВрджреЗрд╢ рднреЗрдЬрддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдЙрд╕рдХреЗ рд╕реВрдЪрдХ рдХреЛ рдирд╣реАрдВ рдмрджрд▓рддреЗ рд╣реИрдВред
рдХрд┐рд╕реА рд╡рд╕реНрддреБ рдХреЛ рд╕рдВрджрд░реНрдн рд╕реЗ рд╕рдВрджреЗрд╢ рднреЗрдЬрдиреЗ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг NSMutableArray *array = [NSMutableArray array]; void (^myBlock3)() = ^() { [array addObject:@"someString"];}; myBlock3();
рд▓реЗрдХрд┐рди рдХрднреА-рдХрднреА, рдлрд┐рд░ рднреА, рдореЗрдореЛрд░реА рд▓реАрдХ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП,
__block
рд╕рд╛рде рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╕реВрдЪрдХ рдХреЛ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред ("рдореЗрдореЛрд░реА рдореИрдиреЗрдЬрдореЗрдВрдЯ" рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рдЗрд╕ рдкрд░ рдЕрдзрд┐рдХ)
C ++ рд▓рдВрдмреЛрджрд░
рдкрдХрдбрд╝реЗ рдЧрдП рдЪрд░ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕реНрдерд╛рди
[5] рдореЗрдВ рдЗрдВрдЧрд┐рдд рдХрд┐рдП рдЧрдП рд╣реИрдВ, рдЕрд░реНрдерд╛рддреН рд╡рд░реНрдЧ рдХреЛрд╖реНрдардХ рдХреЗ рдЕрдВрджрд░ []
[&]
- рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рд╣рдо рд╕рднреА рд╡рд░реНрдгреЛрдВ рдХреЛ рд╕рдВрджрд░реНрдн рджреНрд╡рд╛рд░рд╛ рдХреИрдкреНрдЪрд░ рдХрд░рддреЗ рд╣реИрдВ[=]
- рд╕рднреА рд╡рд░реНрдг рдореВрд▓реНрдп рджреНрд╡рд╛рд░рд╛[a, &b]
- a
рдорд╛рди a
рдкрдХрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ, b
рд╕рдВрджрд░реНрдн рджреНрд╡рд╛рд░рд╛ рдХреИрдкреНрдЪрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ[]
- рдХреБрдЫ рднреА рдХрдмреНрдЬрд╛ рдирд╣реАрдВ рд╣реИ
рдЙрддреНрдкрд░рд┐рд╡рд░реНрддреА рд╕рдВрджрд░реНрдн рдкрд░ рдХрдмреНрдЬрд╛ рдХрд░рдиреЗ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИ, рдпрд╣ рдХрд╣рддрд╛ рд╣реИ рдХрд┐
рдХрд┐ рдЖрдк рдореВрд▓реНрдп рджреНрд╡рд╛рд░рд╛ рдкрд╛рд░рд┐рдд рдЪрд░ рдХреА рдкреНрд░рддрд┐рдпрд╛рдВ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВред рдЕрдЧрд▓реЗ рднрд╛рдЧ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реАред
рдореЗрдореЛрд░реА рдкреНрд░рдмрдВрдзрди
рдУрдмреНрдЬ-рд╕реА рдмреНрд▓реЙрдХ
рдмреНрд▓реЙрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реИрдВ, рдЙрдиреНрд╣реЗрдВ рд╕реНрдЯреИрдХ рдкрд░ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдмрд╛рдж рдореЗрдВ рдЙрдиреНрд╣реЗрдВ рдвреЗрд░ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ)
рдмреНрд▓реЙрдХ 3 рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди
[7] рдХреЗ рд░реВрдк рдореЗрдВ рдореМрдЬреВрдж рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред
- рдЬрдм рд╣рдо рдмреНрд▓реЙрдХ рдХреЗ рдЕрдВрджрд░ рд╕рдВрджрд░реНрдн (рд╕реНрдЯреИрдХ рд╕реЗ) рд╕реЗ рдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ
NSGlobalBlock
рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдПрдХ рд╕рд┐рдВрдЧрд▓рдЯрди рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред - рдпрджрд┐ рд╣рдо рд╕рдВрджрд░реНрдн рдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ
NSStackBlock
рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдЕрдм рдПрдХ рд╕рд┐рдВрдЧрд▓рдЯрди рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рд╕реНрдЯреИрдХ рдкрд░ рд╕реНрдерд┐рдд рд╣реИред - рдпрджрд┐ рд╣рдо
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) {
рдЗрд╕ рдкрдВрдХреНрддрд┐ рдореЗрдВ рддреНрд░реБрдЯрд┐
NSString *userName = [self parseResponse:responseString];
- рдЬрдм рд╣рдо рдорд▓реНрд▓реЛрдХ рдмреНрд▓реЙрдХ рдореЗрдВ рд╕реНрд╡рдпрдВ рдкрд░ рдХреБрдЫ рдХрд╣рддреЗ рд╣реИрдВ, рд╕реЗрд▓реНрдл рд░рд┐рдЯрди, рд╕реНрд╡рд╛рдорд┐рддреНрд╡ рдЧреНрд░рд╛рдл рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд▓реВрдк рдмрдирд╛рддреЗ рд╣реИрдВ:
рдЖрдк рдЗрд╕ рддрд░рд╣ рд╕реЗ __block рд╕рдВрд╢реЛрдзрдХ рдХреЗ рд╕рд╛рде рд╕реНрдЯреИрдХ рдкрд░ рд╕реНрд╡рдпрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдордзреНрдпрд╡рд░реНрддреА рд╕реВрдЪрдХ рдмрдирд╛рдХрд░ рдЗрд╕рд╕реЗ рдмрдЪ рд╕рдХрддреЗ рд╣реИрдВ:
рдПрдХ рдХрд╛рд░реНрдпрдХрд╛рд▓ рдЪрдХреНрд░ рдХреЛ рддреЛрдбрд╝рдиреЗ рдХрд╛ рдЙрджрд╛рд╣рд░рдг рдпрд╛, рдЖрдк рдЖрд░рдВрднреАрдХрд░рдг рд╡рд┐рдзрд┐ рдХреЗ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рд╕реЗ рдмреНрд▓реЙрдХ рдХреЛ рдЖрд░рдВрднрд┐рдХ рд╡рд┐рдзрд┐ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ,
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 ++ рдореЗрдВ рд▓рдВрдмрджрд╛ рдПрдХ рдЕрдЬреНрдЮрд╛рдд рдкреНрд░рдХрд╛рд░ рдХреА рд╡рд╕реНрддреБрдПрдВ рд╣реИрдВ рдЬреЛ рд╕реНрдЯреИрдХ рдкрд░ рдмрдирд╛рдИ рдЬрд╛рддреА рд╣реИрдВред
рд▓реИрдореНрдмреНрдбрд╛ рдЬреЛ рдХрд┐рд╕реА рднреА рд╕рдВрджрд░реНрдн рдХреЛ рдХреИрдкреНрдЪрд░ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рдЙрдиреНрд╣реЗрдВ рдлрд╝рдВрдХреНрд╢рди рдкреЙрдЗрдВрдЯрд░ рдореЗрдВ рдбрд╛рд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╡реЗ рдХреЗрд╡рд▓ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рд╕рдВрдХреЗрдд рд╣реИрдВред рдПрдХ рд▓рдВрдмреЛрджрд░ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд╡рд╕реНрддреБ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдПрдХ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдФрд░ рдПрдХ рд╡рд┐рдзреНрд╡рдВрд╕рдХ рд╣реИ, рдЬреЛ рд╕реНрдЯреИрдХ рдкрд░ рдЦрдбрд╝рд╛ рд╣реИред
рдпрд╣рд╛рдВ рдвреЗрд░ рдореЗрдВ рдмрдврд╝рддреЗ рд▓рдВрдмреЛрджрд░ рдХреЗ рдХреБрдЫ рдЙрджрд╛рд╣рд░рдг рджрд┐рдП рдЧрдП рд╣реИрдВ
рдвреЗрд░ рдореЗрдВ рдПрдХ рдореЗрдордиреЗ рдХреЛ рд╣рд┐рд▓рд╛рдиреЗ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдЕрдм рдЖрдк рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХрд┐рд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд╕рджрд╕реНрдп рдЪрд░ рдореЗрдВ рдкрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рд▓реИрдореНрдмреНрдбрд╛ рддрд░реНрдХреЛрдВ рдХреА рдШреЛрд╖рдгрд╛ рдХреЗ рдмрд╛рдж
рдЙрддреНрдкрд░рд┐рд╡рд░реНрддрд┐рдд , рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЖрдк рдореВрд▓реНрдп рджреНрд╡рд╛рд░рд╛ рдХреИрдкреНрдЪрд░ рдХреА рдЧрдИ рдЪрд░ рдХреА рдкреНрд░рддрд┐рдпреЛрдВ рдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреЛ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ (рдореВрд▓ рдЪрд░ рдХрд╛ рдореВрд▓реНрдп рдирд╣реАрдВ рдмрджрд▓реЗрдЧрд╛)ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рд╣рдордиреЗ рдПрдХ рд▓реИрдореНрдмреНрдбрд╛ рдХреЛ рдЗрд╕ рддрд░рд╣ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рд╣реИ:
auto lambda = [multiplier](int num) throw() mutable
рд╣рдо рд▓реИрдореНрдмреНрдбрд╛ рдХреЗ рдЕрдВрджрд░
multiplier
рдорд╛рди рдХреЛ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдШреЛрд╖рд┐рдд рдЧреБрдгрдХ рдХреЛ рдирд╣реАрдВ рдмрджрд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдкрд░рд┐рд╡рд░реНрддрд┐рдд
multiplier
рдорд╛рди рдХреЛ рдХреЙрд▓ рд╕реЗ рдЗрд╕ рд▓рдВрдмреЛ рдЗрдВрд╕реНрдЯреЗрдВрд╕ рдХреЗ рдХреЙрд▓ рд╕реЗ рдмрдЪрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЖрдк рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдХрд▓реНрдкрдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: рдПрдХ рд▓реИрдореНрдмреНрдбрд╛ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ (рдХрд┐рд╕реА рд╡рд╕реНрддреБ рдореЗрдВ) рдЪрд░ рд╕рджрд╕реНрдпреЛрдВ рдХреЛ рдкрд╛рд░рд┐рдд рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рдЕрдиреБрд░реВрдк рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╣рдореЗрдВ рдпрд╣рд╛рдВ рд╕рд╛рд╡рдзрд╛рди рд░рд╣рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЕрдЧрд░ рд╣рдо рдПрдХ рд▓рдВрдмреЛ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреА рдирдХрд▓ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЙрд╕реЗ рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпреЗ рд╕рджрд╕реНрдп рдЪрд░ рдореВрд▓ рд▓реИрдореНрдмреНрдбрд╛ рдореЗрдВ рдирд╣реАрдВ рдмрджрд▓реЗрдВрдЧреЗ, рд╡реЗ рдХреЗрд╡рд▓ рдХреЙрдкреА рдХрд┐рдП рдЧрдП рдПрдХ рдореЗрдВ рдмрджрд▓ рдЬрд╛рдПрдВрдЧреЗред рдХрднреА-рдХрднреА рдЖрдкрдХреЛ
std::ref
рдореЗрдВ рд▓рд┐рдкрдЯреЗ lambdas рдХреЛ рдкрд╛рд╕ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ
std::ref
ред Obj-C рдмреНрд▓реЙрдХ рдмреЙрдХреНрд╕ рд╕реЗ рдмрд╛рд╣рд░ рдРрд╕рд╛ рдЕрд╡рд╕рд░ рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред
рдЙрджреНрджреЗрд╢реНрдп-рд╕реА ++
рдЪреВрдВрдХрд┐ Objecitve-C ++ рдСрдмреНрдЬреЗрдХреНрдЯрд┐рд╡-C рдФрд░ C ++ рджреЛрдиреЛрдВ рдХреЛ рдЬреЛрдбрд╝рддреА рд╣реИ, рдЖрдк рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рд▓реИрдореНрдмреНрдбрд╛ рдФрд░ рдмреНрд▓реЙрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд▓реИрдореНрдмреНрдбрд╛ рдФрд░ рдмреНрд▓реЙрдХ рдПрдХ рджреВрд╕рд░реЗ рд╕реЗ рдХреИрд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИрдВ?
- рд╣рдо рдмреНрд▓реЙрдХ рдХреЛ рдПрдХ рд▓реИрдореНрдмреНрдбрд╛ рдЕрд╕рд╛рдЗрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЙрджрд╛рд╣рд░рдг void (^block_example)(int); auto lambda_example = [](int number){number++; NSLog(@"%d", number);}; block_example = lambda_example; block_example(10);
- рд╣рдо std :: function рдХреЛ рдПрдХ рдмреНрд▓реЙрдХ рдЕрд╕рд╛рдЗрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ
рдпрд╣рд╛рдВ рдпрд╣ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рдСрдмреНрдЬреЗрдХреНрдЯрд┐рд╡-рд╕реА рдФрд░ рд╕реА ++ рдореЗрдВ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдореЗрдореЛрд░реА рдореИрдиреЗрдЬрдореЗрдВрдЯ рдкреЙрд▓рд┐рд╕реА рд╣реИрдВ, рдФрд░ std::function
рдореЗрдВ рдПрдХ рдмреНрд▓реЙрдХ рд╕реНрдЯреЛрд░ рдХрд░рдиреЗ рд╕реЗ рд▓рд┐рдВрдХрд┐рдВрдЧ рдЦрддрд░реЗ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред
- рд╣рдо рд▓реИрдВрдмрдбрд╛ рдмреНрд▓реЙрдХ рдирд╣реАрдВ рджреЗ рд╕рдХрддреЗред
рд▓реИрдореНрдмреНрдбрд╛ рдореЗрдВ рдХреЙрдкреА-рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдирд╣реАрдВ рд╣реИред рдЗрд╕рд▓рд┐рдП, рд╣рдо рдЗрд╕реЗ рдмреНрд▓реЙрдХ рдпрд╛ рд╕реНрд╡рдпрдВ рднреА рдЕрд╕рд╛рдЗрди рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред
рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдореЗрдВ рддреНрд░реБрдЯрд┐ int main() { auto lambda1 = []() -> void { printf("Lambda 1!\n"); }; lambda1 = lambda1;
рдпрд╣ рдХрд╣рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рд▓реИрдореНрдмреНрдбрд╛ рдФрд░ рдмреНрд▓реЙрдХреЛрдВ рдХреЗ рдмреАрдЪ рд╕рдВрдЪрд╛рд▓рди рдХрд╛рдлреА рд╡рд┐рджреЗрд╢реА рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рдРрд╕реЗ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдХрднреА рдирд╣реАрдВ рджреЗрдЦреЗ рд╣реИрдВред
рд╕рдВрдмрдВрдзрд┐рдд рд▓рд┐рдВрдХ
- C ++ рд▓реИрдВрдмрдбрд╛рд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ
- рд╢реЙрд░реНрдЯ рд╕рд░реНрдХрд┐рдЯ
- Apple рдмреНрд▓реЙрдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ
- рдЕрдВрдЧреНрд░реЗрдЬреА рдореЗрдВ рд▓реИрдореНрдмреНрдбрд╛ рдФрд░ рдмреНрд▓реЙрдХ рдХреА рддреБрд▓рдирд╛
- рдбреЙрдХреНрд╕ рд╕реА ++ рд▓реИрдореНрдмреНрдбрд╛
- рдмреНрд▓реЙрдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ
- рдмреНрд▓реЙрдХреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╢рд╛рдирджрд╛рд░ рд╡реАрдбрд┐рдпреЛ
- Stackoverflow.com рдкрд░ C ++ рд▓реИрдореНрдмреНрдбрд╛ рдореЗрдореЛрд░реА рдХреЗ рдЖрдпреЛрдЬрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкреНрд░рд╢реНрди
- рд░рдирдЯрд╛рдЗрдо рдореЗрдВ C ++ рд▓рдВрдмреЛрджрд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкреНрд░рд╢реНрди
- рд▓рдВрдмреЛрджрд░ рдФрд░ рдмреНрд▓реЙрдХреЛрдВ рдХреА рдмрд╛рддрдЪреАрдд рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ
- рд▓рдВрдмреЛрджрд░ рд╕рд┐рдВрдЯреЗрдХреНрд╕
- рдЙрджреНрджреЗрд╢реНрдп-рд╕реА рдФрд░ рд╕реА ++ рдХреА рдмрд╛рддрдЪреАрдд рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ
- C ++ рдХреЛ Objective-C рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдПрдореНрдмреЗрдб рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ