рдПрдХ рд╡рд┐рдзрд┐ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рдирд╛ред рдЬрд╛рд╡рд╛ рд╕реЗ рдкреНрд░реЗрд░рд┐рдд рд╣реИ

рдирд┐рд░рдВрддрд░рддрд╛ рдпрд╣рд╛рдБ рдкрдврд╝реА рдЬрд╛ рд╕рдХрддреА рд╣реИ habrahabr.ru/post/170265

рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐


рдПрдВрдбреНрд░реЙрдЗрдб рд╡рд┐рдХрд╛рд╕ рдХреА рдореВрд▓ рдмрд╛рддреЛрдВ рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░рддреЗ рд╣реБрдП, рдореБрдЭреЗ рдЬрд╛рд╡рд╛ рдЬреИрд╕реА рдЕрджреНрднреБрдд рднрд╛рд╖рд╛ рдХреЛ рдЬрд╛рдирдирд╛ рдерд╛ред Google рдХреЗ рдЧреЗрдЯрд╕реНрдЯрд╛рд░реНрдЯ рдХреЗ рдЕрдЧрд▓реЗ рднрд╛рдЧ рдХреЛ рдкрдврд╝рддреЗ рд╣реБрдП, рдореИрдВ рдЗрд╕ рдбрд┐рдЬрд╝рд╛рдЗрди рдкрд░ рдЖрдпрд╛:

Button.OnClickListener mTakePicSOnClickListener = new Button.OnClickListener() { @Override public void onClick(View v) { } }; 

рдПрдХ OnClickListener рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдХреА рдШреЛрд╖рдгрд╛ рдФрд░ рдЗрд╕рдХреА onClick рд╡рд┐рдзрд┐ (рдореБрдЭреЗ рдЬрд╛рд╡рд╛ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЛ рд╕рд╣реА рдХрд░реЗрдВ) рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рдирд╛ред рд╣рдореНрдо, рдореИрдВрдиреЗ рд╕реЛрдЪрд╛, рд▓реЗрдХрд┐рди рдСрдмреНрдЬреЗрдХреНрдЯрд┐рд╡-рд╕реА рдореЗрдВ рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХрд╛ рд╣реЛрдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛, рдЕрд░реНрдерд╛рдд рдХрд┐рд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд╡рд┐рдзрд┐ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди (рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдСрдмреНрдЬреЗрдХреНрдЯ, рдФрд░ рдХреНрд▓рд╛рд╕ рдХреЗ рд╕рднреА рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЗ рд▓рд┐рдП рд╡рд┐рдзрд┐ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдирд╣реАрдВ) рдХреЛ рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдФрд░ рд░рдирдЯрд╛рдЗрдо рдореЗрдВ рдмреНрд▓реЙрдХ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рднреА!) рдФрд░ рднреВрд▓ рдЧрдпрд╛ рдпрд╣ рд╕рдм рддрдм рддрдХ рд╣реИ ... рдЬрдм рддрдХ рд╡рд╣ рдмрд╛рд░рд┐рд╢ рдХреЗ рдореМрд╕рдо рдореЗрдВ рдПрдХ рдЦрд╛рд▓реА рдмрд╕ рдореЗрдВ рдирд╣реАрдВ рдерд╛ред рдмрд╣реБрдд рд╕рдордп рдерд╛ рдФрд░ рдореИрдВрдиреЗ рдЗрд╕ рдмрд╛рдд рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рдХрд┐ рдпрд╣рд╛рдВ рдХреНрдпрд╛ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдпрд╣ рдХреНрдпреЛрдВ рдЬрд░реВрд░реА рдерд╛? рдкреНрд░рд╛рд░рдВрдн рдореЗрдВ, рдореИрдВ рдРрд╕рд╛ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛:

 tableView1.delegate = [[NSObject new] override:@selector(tableView:didDeselectRowAtIndexPath:) imp:^void(NSIndexPath* ip){ NSLog(@"selected row %i", ip.row); }] tableView2.delegate = [[NSObject new] override:@selector(tableView:didDeselectRowAtIndexPath:) imp:^void(NSIndexPath* ip){ NSLog(@"selected row %i", ip.row); }] 

рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдпрд╣ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдХреЛ рдмрджрд▓рдиреЗ рдФрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП рдкреВрд░реНрд╡рдирд┐рд░реНрдзрд╛рд░рд┐рдд рддрд░реАрдХреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рд╡рд╛рд▓рд╛ рд╣реИред рдФрд░ tableView рдореВрд▓ рд░рд╣рддрд╛ рд╣реИ, рдмрд┐рдирд╛ рдХрд┐рд╕реА рдмрджрд▓рд╛рд╡ рдХреЗред

рдЙрд╕реА рдЬрдЧрд╣, рдореИрдВрдиреЗ рдорд╣рд╕реВрд╕ рдХрд┐рдпрд╛ рдХрд┐ рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЙрджреНрджреЗрд╢реНрдпрдкреВрд░реНрдг рд╕реА-рд░рдирдЯрд╛рдЗрдо рдХреЗ рд╕рдореГрджреНрдз рдЖрдВрддрд░рд┐рдХ рджреБрдирд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж рдерд╛ред
рдФрд░ рд╣рд╛рдБ, рдЙрд╕реА рдЬрдЧрд╣ рдиреЗ рдореБрдЭреЗ рдирд┐рд░рд╛рд╢ рдирд╣реАрдВ рдХрд┐рдпрд╛ред


рдЙрджрд╛рд╣рд░рдг


рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдФрд░ рдиреБрдХрд╕рд╛рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореИрдВ рдереЛрдбрд╝рд╛ рдХрдо рдмрддрд╛рдКрдВрдЧрд╛
1) рдирд╡ рдирд┐рд░реНрдорд┐рдд UIViewContoller'a рдХреЗ рд▓рд┐рдП viewWillApear рд╡рд┐рдзрд┐ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рдирд╛

 UIViewController* vc = [[UIViewController new] overrideMethod:@selector(viewWillAppear:) blockImp:^id(UIViewController* selfVC, BOOL anim) { selfVC.view.backgroundColor=[UIColor redColor]; //  view }]; [self presentViewController:vc animated:YES completion:^{ }]; // vc 

2) UITableViewDataSource рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди

  // ds (  MMProxy ) MMProxy *ds = [MMProxy proxyWithMMObject]; //     NSArray *arr=@[@"one",@"two",@"three", @"four",@"five"]; //   (  ,    ) //:  isRequired         (@required) //   (@option) //     [ds addMethod:@selector(numberOfSectionsInTableView:) fromProtocol:@protocol(UITableViewDataSource) isRequired:NO blockImp:^NSUInteger(id object, UITableView* tb) { return 1; }]; [ds addMethod:@selector(tableView:numberOfRowsInSection:) fromProtocol:@protocol(UITableViewDataSource) isRequired:YES blockImp:^NSUInteger (id object, UITableView* tb) { return [arr count]; }]; [ds addMethod:@selector(tableView:cellForRowAtIndexPath:) fromProtocol:@protocol(UITableViewDataSource) isRequired:YES blockImp:^id(id obj, UITableView* tb, NSIndexPath* indexPath) { static NSString *TableIdentifier = @"SimpleTableItem"; UITableViewCell *cell = [tb dequeueReusableCellWithIdentifier:TableIdentifier]; if (cell == nil) cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:TableIdentifier]; cell.textLabel.text=arr[indexPath.row]; return cell; }]; self.tableView.dataSource=(id<UITableViewDataSource>)ds; [self.tableView reloadData]; 

3) рдЬрд╛рд╡рд╛ рдХреА рддрд░рд╣ред

 //UIOnClickListener  .    onClick:    //-(IBAction)onClick:(id)sender{}; [button1 addTarget:[[UIOnClickListener new] overrideMethod:@selector(onClick:) blockImp:^void(id obj,id sender){ NSLog(@"bump 1"); }] action:@selector(onClick:) forControlEvents:UIControlEventTouchUpInside]; [button2 addTarget:[[UIOnClickListener new] overrideMethod:@selector(onClick:) blockImp:^void(id obj,id sender){ NSLog(@"bump 2"); }] action:@selector(onClick:) forControlEvents:UIControlEventTouchUpInside]; 


рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди


рдЗрд╕рд▓рд┐рдП, рдореЗрд░реЗ рдкрд╛рд╕ рдЗрд╕рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рдЪрд╛рд░ рдФрд░ рдПрдХ рдпреЛрдЬрдирд╛ рдереА:

рдореВрд░реНрдЦ, рдореИрдВ рдХрд┐рддрдирд╛ рднреЛрд▓рд╛ рдерд╛ред

# 1 рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ

рдпрд╣рд╛рдБ рдпрд╣ рд╢рд╛рдпрдж рдПрдХ рдЫреЛрдЯреЗ рд╕реЗ рд╡рд┐рд╖рдпрд╛рдВрддрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд╛рдпрдХ рд╣реИ рдФрд░ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝рд╛ рдмрддрд╛рдПрдВред рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдСрдмреНрдЬреЗрдХреНрдЯрд┐рд╡-рд╕реА рдореЗрдВ рдПрдХ рд╡рд┐рдзрд┐ рдХреНрдпрд╛ рд╣реИ:

рдЪреВрдВрдХрд┐ рдпрд╣ рд╡рд┐рдзрд┐ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛рдИ рдЧрдИ рдереА, рдЗрд╕рд▓рд┐рдП рдЖрдИрдПрдордкреА рд╕реЗ рдирд┐рдкрдЯрдирд╛ рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рдЖрд╡рд╢реНрдпрдХ рдерд╛ред рд▓реЗрдХрд┐рди рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, Apple рдХрд╛ рдкреНрд░рд▓реЗрдЦрди рдмрд╣реБрдд рд╕рддрд╣реА рдерд╛ред рдЗрд╕ рдкреЗрдЬ рдкрд░ рдЖрдИрдПрдо рджреНрд╡рд╛рд░рд╛ рдкрд╛рдпрд╛ рдЧрдпрд╛ рд╕рднреА:
рдПрдХ рдЙрджреНрджреЗрд╢реНрдп-рд╕реА рд╡рд┐рдзрд┐ рдХреЗрд╡рд▓ рдПрдХ рд╕реА рдлрд╝рдВрдХреНрд╢рди рд╣реИ рдЬреЛ рдХрдо рд╕реЗ рдХрдо рджреЛ рддрд░реНрдХ рд▓реЗрддреА рд╣реИ - рд╕реНрд╡ рдФрд░ _cmdред рдЖрдк рдлрд╝рдВрдХреНрд╢рди class_addMethod рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреНрд▓рд╛рд╕ рдореЗрдВ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд╛рд░реНрдп рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП:

рдФрд░ рджреГрд╢реНрдп рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рдЫреЛрдЯрд╛ рдЙрджрд╛рд╣рд░рдг - (рд╢реВрдиреНрдп) рд╡рд┐рдзрд┐; рд▓реЗрдХрд┐рди рдЙрди рддрд░реАрдХреЛрдВ рдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рдХрд░рдирд╛ рд╣реИ рдЬрд┐рдирдХреЗ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИрдВ (рдпрд╛ рдХреБрдЫ рд╡рд╛рдкрд╕ рдХрд░рдирд╛) рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рдерд╛ред рдФрд░ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд! рд╕реА-рдлрд╝рдВрдХреНрд╢рди рдЕрдЪреНрдЫрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рдмреНрд▓реЙрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛, рдЙрдирдХреЗ рд╕рд╛рде рдХреИрд╕реЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рдирд╛ рд╣реИ? рдЗрди рджреЛ рд╕рд╡рд╛рд▓реЛрдВ рдиреЗ рдореБрдЭреЗ рдЗрд╕ рдЕрджреНрднреБрдд рд▓реЗрдЦ рддрдХ рдкрд╣реБрдВрдЪрд╛рдпрд╛ рдФрд░ рдореБрдЭреЗ рдЕрдкрдиреЗ рд╕рднреА рд╕рд╡рд╛рд▓реЛрдВ рдХреЗ рдЬрд╡рд╛рдм рдорд┐рд▓реЗред Ios 4 рдХреЗ рд╕рд╛рде рд╢реБрд░реВ, рд░рдирдЯрд╛рдЗрдо рдПрдк рдЖрдкрдХреЛ рдмреНрд▓реЙрдХ рд╕реЗ рд╕реАрдзреЗ рдЖрдИрдПрдо рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рд╡реИрд╕реЗ, Apple рдХреЗ рд░рдирдЯрд╛рдЗрдо рдПрдкреАрдЖрдИ рдкреНрд░рд▓реЗрдЦрди рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рд╢рдмреНрдж рдирд╣реАрдВ рдХрд╣рддрд╛ рд╣реИред рдпрд╣рд╛рдБ рдПрдХ рд╣реА рд▓реЗрдЦ рд╕реЗ рдЫреЛрдЯрд╛ рд╕рд╛ рднреВрдд рдХрд╛ рдЙрджрд╛рд╣рд░рдг рдФрд░ рдЙрджрд╛рд╣рд░рдг рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:


 -(void)doSomething: void(*doSomethingIMP)(id s, SEL _c); void(^doSomethingBLOCK)(id s); -(void)doSomethingWith:(int)x; void(*doSomethingWithIMP)(id s, SEL _c, int x); void(^doSomethingWithBLOCK)(id s, int x); -(int)doToThis:(NSString*)n withThat:(double)d; int(*doToThis_withThatIMP)(id s, SEL _c, NSString *n, double d); int(^doToThis_withThatBLOCK)(id s, NSString *n, double d); 


рдЙрд╕ рд╕рдордп, рдореИрдВ рд╡рд┐рдзрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддрд╛ рдерд╛, рдмреНрд▓реЙрдХ рд╕реЗ рдПрдХ рдЖрдИрдПрдо рдмрдирд╛ рд╕рдХрддрд╛ рд╣реВрдВ рдФрд░ рдкреБрд░рд╛рдиреЗ рдЖрдИрдПрдо рдХреЛ рдмреНрд▓реЙрдХ рд╕реЗ рдПрдХ рдирдП рдХреЗ рд╕рд╛рде рдмрджрд▓ рд╕рдХрддрд╛ рд╣реВрдВ, рд╕рднреА рд░рдирдЯрд╛рдЗрдо рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рдпрд╣рд╛рдБ рдпрд╣ рд╣реИ, рдореИрдВрдиреЗ рд╕реЛрдЪрд╛, рдпрд╣ рдХрд┐рддрдирд╛ рд╕рд░рд▓ рд╣реИ рдФрд░ рдХрд┐рд╕реА рдиреЗ рдЕрднреА рддрдХ рдХреНрдпреЛрдВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ? рдФрд░ рдХреЗрд╡рд▓ рдпрд╣рд╛рдБ рдореБрдЭреЗ рдЕрдкрдиреА рдЧрд▓рддреА рдХрд╛ рдПрд╣рд╕рд╛рд╕ рд╣реБрдЖ ... рдореИрдВ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рд╛рде рджрд┐рдЦрд╛рдКрдВрдЧрд╛:

 NSString *str1= @""; [str1 overrideMethod:@selector(intValue) imp:^int(NSString* selfStr){ return 1;}]; NSString *str2= @""; [str2 overrideMethod:@selector(intValue) imp:^int(NSString* selfStr){ return 2;}]; [str1 intValue]; //  2,   1 [str2 intValue]; //  2 

рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдмреБрд░рд╛ рд╣реЛрдЧрд╛ ... рдПрдХ рдмреНрд▓реЙрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рд╡рд░реНрдЧ рдХреЗ рд╕рднреА рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рдзрд┐ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╢реБрд░реВ рдореЗрдВ рдореБрдЭреЗ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рдереАред

# 2 рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ

рдФрд░ рдореИрдВрдиреЗ рдлрд┐рд░ рд╕реЗ рд╢реБрд░реБрдЖрдд рдХреА, "рдирд╛рдЗрдЯ рдореВрд╡" рдмрдирд╛рддреЗ рд╣реБрдПред рдпрд╣ рдПрдХ рдирдпрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреБрд░рд╛рдиреА рдкрджреНрдзрддрд┐ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп рддрдп рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдПрдХ рдЕрджреНрд╡рд┐рддреАрдп рдирд╛рдо рдХреЗ рд╕рд╛рдеред рдФрд░, рд╡рд╕реНрддреБ рдХреЗ рд▓рд┐рдП рд╕рдВрджреЗрд╢ рднреЗрдЬрдиреЗ рдХреЛ рд░реЛрдХрддреЗ рд╣реБрдП, рдХрдорд╛рдВрдб / рд╡рд┐рдзрд┐ рдЪрдпрдирдХрд░реНрддрд╛ рдХреЛ рдмрджрд▓реЗрдВред рдЬреЛрдбрд╝реА <рдкрддрд╛> _ <рдкреБрд░рд╛рдиреЗ рдЪрдпрдирдХрд░реНрддрд╛> рдХреЛ рдЪрдпрдирдХрд░реНрддрд╛ рдХреЗ рдЕрджреНрд╡рд┐рддреАрдп рдирд╛рдо рдХреЗ рд░реВрдк рдореЗрдВ рдЪреБрдирд╛ рдЧрдпрд╛ рдерд╛ред рдпрд╛рдиреА рдкрд┐рдЫрд▓реЗ рдХреЛрдб рдХреЛ рдЗрд╕реЗ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП:

 // 0x0000042 NSString *str1= @""; //   0x0000042_intValue [str1 overrideMethod:@selector(intValue) imp:^int(NSString* selfStr){ return 1;}]; // 0x0000043 NSString *str2= @""; //   0x0000043_intValue [str2 overrideMethod:@selector(intValue) imp:^int(NSString* selfStr){ return 2;}]; [str1 0x0000042_intValue]; // 1 [str2 0x0000043_intValue]; // 2 


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

рдСрдмреНрдЬреЗрдХреНрдЯрд┐рд╡-рд╕реА рдореЗрдВ, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдХрд┐рд╕реА рд╡рд╕реНрддреБ рдХреЛ рд╕рдВрджреЗрд╢ рднреЗрдЬрдирд╛ рд░реЛрдХрдирд╛ рд╕рдВрднрд╡ рд╣реИ:
  1. NSProxy рдЖрд╡рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп
  2. рдпрджрд┐ рд╡рд╕реНрддреБ рдПрдХ рд╕рдВрджреЗрд╢ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреА рд╣реИ рдХрд┐ рд╡рд╣ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреА (рдЧреИрд░-рдорд╛рдиреНрдпрддрд╛ рдкреНрд░рд╛рдкреНрдд рдЪрдпрдирдХрд░реНрддрд╛)


рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, NSObject рдХреЛ рднреЗрдЬреЗ рдЧрдП рдХрд┐рд╕реА рднреА рд╕рдВрджреЗрд╢ рдХреЛ рд░реЛрдХрдирд╛ рдЕрд╕рдВрднрд╡ рд╣реИ (рдпрд╛ рдореБрдЭреЗ рдЕрднреА рдпрд╣ рдкрддрд╛ рдирд╣реАрдВ рд╣реИ?)ред
NSProxy рд╕реЗ рдПрдХ рдЖрд╡рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдорд┐рд▓ рд╕рдХрддреА рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣:
1) рдЗрддрдирд╛ рд╕реБрдВрджрд░ рдирд╣реАрдВ рд╣реИ
 NSString *str1= @""; NSProxy *proxy=[NSProxy proxyWithObject:str1]; [proxy overrideMethod:@selector(intValue) imp:^int(NSString* selfStr){ return 1;}]; [proxy intValue]; // 1 

2) рдХрднреА-рдХрднреА рдпрд╣ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ ApplicationDidBecomeActive рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдХреЛ рднреЗрдЬрд╛ рдЬрд╛рдПрдЧрд╛, рдкреНрд░реЙрдХреНрд╕реА рд╕реЗ рдЖрд╡рд░рдг рдирд╣реАрдВред рдРрд╕рд╛ рдХреНрдпреЛрдВ? рдпрд╣ рдПрдХ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ рд╕рд╡рд╛рд▓ рд╣реИ ...

 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { NSProxy *p=[NSProxy proxyWithObject:self]; // Override point for customization after application launch. [p overrideMethod:@selector(applicationDidBecomeActive:) blockImp:^void(id obj,UIApplication* app) { UIAlertView *alv=[[UIAlertView alloc] initWithTitle:@"ss" message:nil delegate:nil cancelButtonTitle:@"fuuu" otherButtonTitles:nil]; [alv show]; [alv release]; }]; return YES; } 

рдФрд░ рдореИрдВрдиреЗ рджреЛрдиреЛрдВ рддрдВрддреНрд░реЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХ рд╡рд┐рдзрд┐ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛:
1) NSProxy рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗред рдЕрдзрд┐рдХ рд╕рд╣реА рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рд╣реИ
2) NSObject рдХреЗ рдХрд┐рд╕реА рднреА рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдХреЗ рд▓рд┐рдП рдПрдХ рдмреИрд╕рд╛рдЦреА, рд▓реЗрдХрд┐рди рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗред
рдФрд░ рдЪреВрдВрдХрд┐ NSObject рдФрд░ NSProxy рд░реВрдЯ рдХреНрд▓рд╛рд╕ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ рд░реВрдк рд╕реЗ рд░рдирдЯрд╛рдЗрдо рдореЗрдВ рдХрд┐рд╕реА рднреА рдСрдмреНрдЬреЗрдХреНрдЯрд┐рд╡-рд╕реА рдХреНрд▓рд╛рд╕ рдХреЗ рд▓рд┐рдП рдкреВрд░реНрд╡рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд╡рд┐рдзрд┐ рдХреЛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рд╣реИред рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ, рдпрд╣ рдХрд╛рдлреА рдирд╣реАрдВ рдерд╛ред

рдЗрд╕рд▓рд┐рдП, рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдпрд╣ рдмрддрд╛рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ рдХрд┐ NSProxy рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рд╕рдм рдХреБрдЫ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:


NSObject рдХреЗ рд▓рд┐рдП рдмреИрд╕рд╛рдЦреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рд╕рдм рдХреБрдЫ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ

рдЗрд╕ рддрд░рд╣ рдХреЗ рдмреИрд╕рд╛рдЦреА рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕рдорд╕реНрдпрд╛рдУрдВ рд╕реЗ рднрд░рд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдХреЛрдИ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╡рд░реНрдЧ рдЕрдЧреНрд░реЗрд╖рдг рд╡рд┐рдзрд┐ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рддрд╛ рд╣реИ, рддреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдЕрдм рдЗрд╕рдХреЗ рд▓рд┐рдП рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдФрд░ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд, рдкреБрд░рд╛рдиреА рдкрджреНрдзрддрд┐ рдХреЛ рдирд╖реНрдЯ рдХрд░рдирд╛ рдФрд░ рдЕрдЧреНрд░реЗрд╖рдг рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдПрдХ рдмрд╣реБрдд рд╣реА рдЧрдВрднреАрд░ рдкреНрд░рджрд░реНрд╢рди рд╣рд┐рдЯ рд╣реИред рдФрд░ рд╡рд░реНрдЧ рдХреЗ рд╕рднреА рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд▓рд┐рдПред рдореИрдВ рдпрд╣ рд╕рдордЭрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛: рдпрджрд┐ рд╣рдо рдПрдирдПрд╕рдПрд╕рдЯреАрд░рд┐рдВрдЧ рдХреНрд▓рд╛рд╕ рдХреЛ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдХрд┐рд╕реА рдПрдХ рд╡рд╕реНрддреБ рдХреЗ рд▓рд┐рдП рдЗрдВрдЯрд▓реНрдпреВ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдХреНрд▓рд╛рд╕ рдлрд┐рд░ рдХрднреА рдирд╣реАрдВ рд╣реЛрдЧреАред рдЕрдм, рд╕рднреА NSString рдкреНрд░рддрд┐рдирд┐рдзрд┐рдпреЛрдВ рдХреЛ рдПрдХ intValue рд╕рдВрджреЗрд╢ рднреЗрдЬрддреЗ рд╕рдордп, mm_old_intValue рдХреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдФрд░ рдлрд╝реЙрд░рд╡рд░реНрдбрдЗрдирд╡реЗрд╢рди рддрдВрддреНрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗред

рд╡реИрд╕реЗ, рд╣рдЯрд╛рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдСрдмреНрдЬреЗрдХреНрдЯрд┐рд╡-рд╕реА 2.0 рдиреЗ рддрд░реАрдХреЛрдВ рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХреЛ рд╣рдЯрд╛ рджрд┐рдпрд╛ред рдЗрд╕рд▓рд┐рдП, рдореБрдЭреЗ рдПрдХ рдФрд░ рдмреИрд╕рд╛рдЦреА рдмрдирд╛рдиреА рдкрдбрд╝реАред рд╣рдЯрд╛рдП рдЬрд╛рдиреЗ рд╕реЗ рдореЗрд░рд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рд╣рдЯрд╛рдП рдЧрдП рддрд░реАрдХреЗ рдХреЗ рдЖрдИрдПрдо рдХреЛ рдЧреИрд░-рдореМрдЬреВрджрд╛ рд╡рд┐рдзрд┐ рдХреЗ рдЖрдИрдПрдо рдХреЗ рд╕рд╛рде рдмрджрд▓рдирд╛ред рдХреБрдЫ рдЗрд╕ рддрд░рд╣

  IMP forw=class_getMethodImplementation(clas, @selector(methodThatDoesNotExist:iHope:::::)); IMP oldImpl= method_setImplementation(method,forw); 

рдпрд╛, рд╕рдордХрдХреНрд╖, _objc_msgForward рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред
 IMP oldImpl= method_setImplementation(method,(IMP)_objc_msgForward); 


рд╣рд╛рдВ, рдЕрдм рд╕рдмрдХреБрдЫ рд╡реИрд╕рд╛ рдирд╣реАрдВ рджрд┐рдЦрддрд╛ рдЬреИрд╕рд╛ рдХрд┐ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ рдерд╛ред рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рдордЬрд╝рд╛ рдЖрдк viewControllers, AppDelegatov, рд╕рд┐рд░реНрдл рдкреНрд░рддрд┐рдирд┐рдзрд┐рдпреЛрдВ рдФрд░ рдЕрдиреНрдп рд╡рд╕реНрддреБрдУрдВ рдХреЗ рддрд░реАрдХреЛрдВ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рдХреЗ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдФрд░ рдпрд╣ рд╕рдм рдХреЛрдб рдХреА рджреЛ рд▓рд╛рдЗрдиреЛрдВ рдореЗрдВред рд▓реЗрдХрд┐рди рддрд░реАрдХреЗ рдЕрд▓рдЧ рд╣реИрдВ: рдХрд╛рд▓реЗ, рдФрд░ рд╕рдлреЗрдж, рдФрд░ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ, рдФрд░ рдирд┐рдЬреА ред рдУрд╣, рдореБрдЭреЗ рдХреБрдЫ рд╣реБрдЖ рд╣реИред

рдкреНрд░рддрд┐рдмрдВрдз

рд╣рд╛рд▓рд╛рдБрдХрд┐ рдХреБрдЫ рдФрд░ рдкреНрд░рддрд┐рдмрдВрдз рд╣реИрдВ рдЬрд┐рдирдХрд╛ рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рдЙрд▓реНрд▓реЗрдЦ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ:

рд╢рд╛рдпрдж рдХреБрдЫ рдФрд░ рдЬрд┐рд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореИрдВ рдирд╣реАрдВ рдЬрд╛рдирддрд╛ред рдПрдХ рдмреЗрдИрдорд╛рдиреА рдХреЗ рдХрдЧрд╛рд░ рдкрд░ рдРрд╕реА рдЬреЛрдбрд╝рддреЛрдбрд╝, рд╡реЗ, рдкреВрд░реНрд╡ рдХреА рддрд░рд╣, рдПрдХ рдирд╛рдЬреБрдХ рдорд╛рдорд▓рд╛ рд╣реИред

рдХреИрд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ

рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рджреЛ рд╕рдВрднрд╛рд╡рд┐рдд рдкрд░рд┐рджреГрд╢реНрдп рд╣реИрдВ:

рдЖрд╡рд░рдг MMProxy рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдмреНрдпрд╛рдЬ рдХреА рд╡рд╕реНрддреБ рдХреЗ рд╕рд╛рде MMProxy рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░реЗрдВ рдФрд░ рдЗрд╕реЗ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВред рд╕рдВрджреЗрд╢ рднреЗрдЬреЗрдВ рдПрдХ рдкреНрд░реЙрдХреНрд╕реА рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдПрдХ рд╡рд╕реНрддреБ рдирд╣реАрдВред
рдПрдХ рдЙрджрд╛рд╣рд░рдг:

 id object; MMProxy *p= [MMProxy proxyWithObject:object]; [object overrideMethod:@selector(onClick:) blockImp:^void(id obj,id sender){ }] ; [p onClick:nil] 

рдкреНрд░рддрд┐рдирд┐рдзрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдкреНрд░реЙрдХреНрд╕реАрд╡рд┐рдердПрдордУрдмрдЬреЗрдХреНрдЯ рд╡рд┐рдзрд┐ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдорд┐рдд рдкреНрд░реЙрдХреНрд╕реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВ
  MMProxy *ds = [MMProxy proxyWithMMObject]; [ds addMethod:@selector(numberOfSectionsInTableView:) fromProtocol:@protocol(UITableViewDataSource) isRequired:NO blockImp:^NSUInteger(id object, UITableView* tb) { return 1; }]; 


рджреВрд╕рд░реА рд╡рд┐рдзрд┐ рдПрдХ рд╢реНрд░реЗрдгреА рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХреА рдЬрд╛рддреА рд╣реИ, рдФрд░ рдЗрд╕рд▓рд┐рдП рдЖрдк рдЙрди рддрд░реАрдХреЛрдВ рдХреЛ рдХреЙрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рдирдХреА рдЖрдкрдХреЛ NSObject рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓реА рдХрд┐рд╕реА рднреА рд╡рд╕реНрддреБ рдкрд░ рдЬрд╝рд░реВрд░рдд рд╣реИред рдореИрдВ рдкрд╣рд▓реЗ рд╣реА рд╕реАрдорд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рдЪреБрдХрд╛ рд╣реВрдВред

рджреЛрдиреЛрдВ рд╡рд┐рдХрд▓реНрдк рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ:
- (рдЖрдИрдбреА) рдУрд╡рд░рд░рд╛рдЗрдбрдореЗрдереЛрдб: (рдПрд╕рдИрдПрд▓) рд╕реЗрд▓ рдмреНрд▓реЙрдХрдЖрдИрдПрдордкреА: (рдЖрдИрдбреА) рдмреНрд▓реЙрдХ;
рдЖрдкрдХреЛ рд╡рд┐рдзрд┐ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдпрджрд┐ рд╡рд┐рдзрд┐ рдХрдХреНрд╖рд╛ рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдЪрдпрдирдХрд░реНрддрд╛ рдкрд░ рдирд╣реАрдВ рджрд┐рдЦрд╛рдИ рджреЗрддреА рд╣реИ (рдпрд╛ рдХреЛрдИ рдЕрдиреНрдп рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реИрдВ), рддреЛ рдПрдХ рдЕрдкрд╡рд╛рдж рдлреЗрдВрдХ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛

- (id) addMethod: (SEL) sel fromProtocol: (рдкреНрд░реЛрдЯреЛрдХреЙрд▓ *) p isRequired: (BOOL) isReq blockImp: (id) рдмреНрд▓реЙрдХ;
рдпрджрд┐ рдЖрдкрдХреЛ рдХрдХреНрд╖рд╛ рдореЗрдВ рдРрд╕реА рд╡рд┐рдзрд┐ рдирд╣реАрдВ рдЖрддреА рд╣реИ, рддреЛ рдЖрдк рдХрд┐рд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдПрдХ рд╡рд┐рдзрд┐ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕реА рддрд░рд╣, рдпрджрд┐ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдЙрддреНрдкрдиреНрди рд╣реЛрддреА рд╣реИ, рддреЛ рдПрдХ рдЕрдкрд╡рд╛рдж рдлреЗрдВрдХ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдЖрд╡реЗрджрди рдХрд╛ рдХреНрд╖реЗрддреНрд░

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

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

рдЖрдк рдкрд░реАрдХреНрд╖рдг рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ: github.com/Flanker4/MMMutableMethods
рдкреБрдирд╢реНрдЪ
"рдЪреБрдЪреА рдПрдХ рд▓реЗрдЦрдХ рдирд╣реАрдВ рд╣реИ, рдЪреБрдЪреНрдЪреА рдПрдХ рдкрд╛рдардХ рд╣реИред" рд╢рд╛рдпрдж рд▓реЗрдЦ рдмрд╣реБрдд рд╣реА рд╕рдордЭ рд╕реЗ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ рдпрд╛ рдЙрд╕рдореЗрдВ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рд╣реИрдВред рдХреНрд╖рдорд╛ рдХрд░реЗрдВ, рдкреАрдПрдо рд▓рд┐рдЦреЗрдВ, рдЗрд╕реЗ рдареАрдХ рдХрд░реЗрдВред

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


All Articles