рдСрдмреНрдЬреЗрдХреНрдЯрд┐рд╡-рд╕реА рдкрд╛рд░реНрдЯ 2 рдореЗрдВ рдмреНрд▓реЙрдХ рдФрд░ рдЙрдирдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ

рд╡рд┐рд╖рдп рдХреА рдирд┐рд░рдВрддрд░рддрд╛ - рдЙрджреНрджреЗрд╢реНрдп-рд╕реА рдореЗрдВ рдмреНрд▓реЙрдХреЛрдВ рдФрд░ рдЙрдирдХреЗ рдЙрдкрдпреЛрдЧ рдкрд░, рднрд╛рдЧ 1 ред

рдЬреЛ рд▓реЛрдЧ рдкрд╣рд▓реЗ рдмреНрд▓реЙрдХ (рдпрд╛ рдмрдВрдж) рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рддреЗ рд╣реИрдВ, рд╡реЗ рд╕рд╡рд╛рд▓ рдкреВрдЫрддреЗ рд╣реИрдВ - тАЬрдХреНрдпреЛрдВ? рдпрджрд┐ рдЖрдк рдЙрдирдХреЗ рдмрд┐рдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╣рд╛рдБ рдЖрдк рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдмреНрд▓реЙрдХреЛрдВ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдХреБрдЫ рдлрд╛рдпрджреЗ рд╣реИрдВ, рдФрд░ рдЙрдирдореЗрдВ рд╕реЗ рдкрд╣рд▓рд╛ рдХреЛрдб рдХреА рдорд╛рддреНрд░рд╛ рдкрд░ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрдЪрдд рд╣реИ, рдФрд░ рдЗрд╕рд▓рд┐рдП рд▓реЗрдЦрди рдФрд░ рд╕рдорд░реНрдерди рдХреЗ рд╕рдордпред рдореИрдВ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рдЖрдЧреЗ рдмреЛрд▓реВрдВрдЧрд╛ред

рд╕рд╛рдордЧреНрд░реА:


1. NSArray рдХреЗ рдЙрджрд╛рд╣рд░рдг рдкрд░ рдХрдВрдЯреЗрдирд░реЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдВред
2. рдпреВрдЖрдИрдЯреЗрдмрд▓ рд╡реНрдпреВ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдкрд░ рдЧрд╛рд░реНрдбред
3. рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рдЕрдиреБрд╕реВрдЪрд┐рдд рд╕рдВрдЪрд╛рд▓рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рдмрдЬрд╛рдп рдмреНрд▓реЙрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ред
4. UIAlertView рдореЗрдВ рдкреНрд░рддрд┐рдирд┐рдзрд┐рдпреЛрдВ рдХреЗ рдмрдЬрд╛рдп рдмреНрд▓реЙрдХред
5. UIView рдПрдирд┐рдореЗрд╢рди, рдПрдирд┐рдореЗрд╢рди рдХрд╛ рдХреНрд░рдоред
6. рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╕рдВрдЪрд╛рд▓рди рдФрд░ рдЙрдирдХрд╛ рдкреНрд░рдмрдВрдзрдиред рдПрдирд┐рдореЗрд╢рди рдХреЗ рд╕рд╛рде рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдирд╛ред

1. NSArray рдХреЗ рдЙрджрд╛рд╣рд░рдг рдкрд░ рдХрдВрдЯреЗрдирд░реЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдВред

рдмреНрд▓реЙрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдЙрджреНрдзреГрдд рдЙрджрд╛рд╣рд░рдг рдХрдВрдЯреЗрдирд░реЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИред рдпрд╣ рд╡рд┐рд╖рдп рдПрдХ рдЕрдкрд╡рд╛рдж рдирд╣реАрдВ рд╣реЛрдЧрд╛, рдЖрдЗрдП рдмреНрд▓реЙрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдХреБрдЫ рдорд╛рдирдХ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕рдорд╛рдзрд╛рди рджреЗрдЦреЗрдВред

Zadacha1

рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд▓рд┐рдЦреЗрдВ, рдЬреЛ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреА рдПрдХ рд╕рд░рдгреА рд╕реЗ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреА рдПрдХ рд╕рд░рдгреА рдмрдирд╛рддрд╛ рд╣реИ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рддрддреНрд╡ рдЖрдиреЗ рд╡рд╛рд▓реА рд╕рд░рдгреА рдореЗрдВ рдПрдХ рд▓рдВрдмреА рд╕рдВрдЧрдд рд░реЗрдЦрд╛ рд╣реИред

Reshenie1:
NSArray* stringsLengths( NSArray* strings_ )
{
NSMutableArray* strings_lengths_ =
[ NSMutableArray arrayWithCapacity: [ strings_ count ] ];
for ( NSString* string_ in strings_ )
{
NSNumber* length_ = [ NSNumber numberWithUnsignedInt: [ string_ length ] ];
[ strings_lengths_ addObject: length_ ];
}
return [ NSArray arrayWithArray: strings_lengths_ ];
}


* This source code was highlighted with Source Code Highlighter .

рд╕рдорд╛рдзрд╛рди 2 рдмреНрд▓реЙрдХ рдХреЗ рд╕рд╛рде:
NSArray* stringsLengths( NSArray* strings_ )
{
return [ strings_ map: ^( id string_ )
{
return (id)[ NSNumber numberWithUnsignedInt: [ string_ length ] ];
} ];
}


* This source code was highlighted with Source Code Highlighter .

рдЯрд╛рд╕реНрдХ реи

рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд╕рд╛рде рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреА рдПрдХ рд╕рд░рдгреА рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╣реИ:
@ interface Element : NSObject

@property ( nonatomic, retain, readonly ) NSArray* subElements;

@end


* This source code was highlighted with Source Code Highlighter .
рдЖрдкрдХреЛ рдПрдХ рдирдИ рд╕рд░рдгреА рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╕рднреА рдЙрдк-рд╢рд╛рдЦрд╛рдУрдВ рдХреЗ рд╕рднреА рддрддреНрд╡ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред

Reshenie1:
NSArray* allSubElements( NSArray* elements_ )
{
NSMutableArray* result_ = [ NSMutableArray array ];

for ( Element* element_ in elements_ )
{
NSArray* object_items_ = element_.subElements;
[ result_ addObjectsFromArray: object_items_ ];
};

return [ NSArray arrayWithArray: result_ ];
}


* This source code was highlighted with Source Code Highlighter .

рд╕рдорд╛рдзрд╛рди 2 рдмреНрд▓реЙрдХ рдХреЗ рд╕рд╛рде:
NSArray* allSubElements( NSArray* elements_ )
{
return [ elements_ flatten: ^( id element_ )
{
return [ element_ subElements ];
} ];
}


* This source code was highlighted with Source Code Highlighter .

NSArray рд╡рд░реНрдЧ рдХреЗ рдХреБрдЫ рдФрд░ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдПрдХреНрд╕рдЯреЗрдВрд╢рди NSArray + BlocksAdditions.m рдореЗрдВ рджреЗрдЦреЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ

2. рдпреВрдЖрдИрдЯреЗрдмрд▓ рд╡реНрдпреВ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдкрд░ рдЧрд╛рд░реНрдбред

рдпрджрд┐ рдПрдирд┐рдореЗрд╢рди рдХреЗ рд╕рд╛рде UITableView рдореЗрдВ рд╕рд╛рдордЧреНрд░реА рдХреЗ рдХрдИ рдЕрдкрдбреЗрдЯ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рддрддреНрд╡ рдЬреЛрдбрд╝реЗрдВ рдФрд░ рджреВрд╕рд░реЗ рдХреЛ рд╣рдЯрд╛ рджреЗрдВ), рддреЛ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдПрдиреАрдореЗрд╢рди рдореЗрдВ рд╕рдм рдХреБрдЫ рд╕рд╛рдл рджрд┐рдЦреЗрдЧрд╛, рдЖрдкрдХреЛ рдЗрди рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ рджреЛ рддрд░реАрдХреЛрдВ рдХреЗ рдХреЙрд▓ рдХреЗ рднреАрддрд░ рд░рдЦрдирд╛ рд╣реЛрдЧрд╛: startppdates рдФрд░ endUpdatesред рдЗрд╕ рдХреЛрдб рдореЗрдВ, рдЖрдк рдХрдИ рдЧрд▓рддрд┐рдпрд╛рдБ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:
[ self beginUpdates ];

[ self.tableView deleteRowsAtIndexPaths: delete_index_pathes_
withRowAnimation: UITableViewRowAnimationBottom ];

// condition_ == true, endUpdates
if ( condition_ )
return ;

[ self.tableView insertRowsAtIndexPaths: insert_index_pathes_
withRowAnimation: UITableViewRowAnimationTop ];

[ self endUpdates ];


* This source code was highlighted with Source Code Highlighter .

рдРрд╕реЗ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдЬреИрд╕реЗ рдХрд┐ рдлрд╛рдЗрд▓реЛрдВ рдпрд╛ рдЕрдиреНрдп рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдореБрдХреНрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рддрдерд╛рдХрдерд┐рдд рдЧрд╛рд░реНрдб рдмрдЪрд╛рд╡ рдореЗрдВ рдЖрддреЗ рд╣реИрдВ, рдЬрд┐рдиреНрд╣реЗрдВ рдмреНрд▓реЙрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЖрд╕рд╛рдиреА рд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред UUUDATE рд╡рд┐рдзрд┐ рдХреЗ рд╕рд╛рде UITableView рд╡рд░реНрдЧ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдЬреЛрдбрд╝реЗрдВ:
@ interface UITableView (BlocksAdditions)

-( void )withinUpdates:( void (^)( void ) )block_;

@end

@implementation UITableView (BlocksAdditions)

-( void )withinUpdates:( void (^)( void ) )block_
{
[ self beginUpdates ];

@ try
{
block_();
}
@ finally
{
[ self endUpdates ];
}
}

@end


* This source code was highlighted with Source Code Highlighter .

рд╣рдо рдПрдирд┐рдореЗрд╢рди рдХреЗ рд╕рд╛рде рддреНрд░реБрдЯрд┐ рдХреЛ рдареАрдХ рдХрд░рддреЗ рд╣реИрдВ:
[ self.tableView withinUpdates: ^( void )
{
[ self.tableView deleteRowsAtIndexPaths: delete_index_pathes_
withRowAnimation: UITableViewRowAnimationBottom ];

if ( condition_ )
return ;

[ self.tableView insertRowsAtIndexPaths: insert_index_pathes_
withRowAnimation: UITableViewRowAnimationTop ];
} ];


* This source code was highlighted with Source Code Highlighter .

3. рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рдЕрдиреБрд╕реВрдЪрд┐рдд рд╕рдВрдЪрд╛рд▓рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рдмрдЬрд╛рдп рдмреНрд▓реЙрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ред

рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рд╣рд▓ рдХреА рдЬрд╛ рд░рд╣реА рд╕рдорд╕реНрдпрд╛ рд╕реАрдзреЗ рдмреНрд▓реЙрдХ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ рдХрд┐ рдЙрдирдХреЗ рдЖрд╡реЗрджрди рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛ рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рдХрд┐рддрдиреА рд╣рд▓ рд╣реЛ рд╕рдХрддреА рд╣реИред

рдЬрд┐рди рд▓реЛрдЧреЛрдВ рдиреЗ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдорд┐рд▓рдХрд░ рдХрд╛рдо рдХрд┐рдпрд╛ рд╣реИ: - [NSObject PerformSelector: withObject: afterDelay:] рдФрд░ + [NSTimer рдЯрд╛рдЗрдорд░WithTimeInterval: target: selector: userInfo: repeats]] рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдбрд┐рдлрд░реНрдб рдХреЙрд▓ рдмрдирд╛рдиреЗ рдХреЗ рдХреНрд╖рдг рдореЗрдВ "рд▓рдХреНрд╖реНрдп" рд╡рд┐рдзрд┐ рдХреЛ "рд▓рдХреНрд╖реНрдп" рдХрд╣рд╛ рдЬрд╛рдПрдЧрд╛ред , рдФрд░ рдпрджрд┐ рдирд┐рдпреЛрдЬрд┐рдд рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ рдЕрдм рдирд╣реАрдВ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ рддреЛ рдЫреЛрдбрд╝ рджреЗрдВред рдЬреИрд╕рд╛ рдХрд┐ рдЕрднреНрдпрд╛рд╕ рд╕реЗ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ, рдпрд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рдмрд╣реБрдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдореЗрдВ рдЕрдХреНрд╕рд░ рдХреЙрд▓ рдкрд░ рдЕрддрд┐рд░рд┐рдХреНрдд рддрд░реНрдХ рд▓рд┐рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ + [NSObject CancelPrepretPerformRequestsWithTarget:] рдФрд░ - [[NSTimer рдЕрдорд╛рдиреНрдп] рдЕрдиреБрд╕реВрдЪрд┐рдд рдХреЙрд▓ рдХреЛ рд░рджреНрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдФрд░ рд▓рдХреНрд╖реНрдп рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдореБрдХреНрдд рдХрд░рдиреЗ рдХреА рдмрд╛рдж рдХреА рд╕рдВрднрд╛рд╡рдирд╛ред
рдпрд╣рд╛рдБ рд╣рдо рдЗрд╕ рд╡рд┐рдЪрд╛рд░ рдкрд░ рдЖрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдПрдХ рдбрд┐рдлрд░реЗрдВрдЯ рдХреЙрд▓ рдмрдирд╛рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реЛрдЧрд╛ рдЬреЛ "рд▓рдХреНрд╖реНрдп" рдХреЛ рд╣рдЯрд╛рдП рдЬрд╛рдиреЗ рдФрд░ рд╕реНрдореГрддрд┐ рд╕реЗ рд╣рдЯрд╛рдП рдЬрд╛рдиреЗ рдкрд░ рд╕реНрд╡рдпрдВ рдХреЛ рд░рджреНрдж рдХрд░рдиреЗ рдХрд╛ рдХрд╛рд░рдг рдирд╣реАрдВ рд╣реЛрдЧрд╛ред
рд╣рдорд╛рд░рд╛ рд▓рдХреНрд╖реНрдп рдПрдХ рдРрд╕реА рд╡рд┐рдзрд┐ рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛ рдЬреЛ рдЗрд╕ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд╕рд╛рде рдКрдкрд░ рдмрддрд╛рдП рдЕрдиреБрд╕рд╛рд░ рдХрд╛рдо рдХрд░реЗ:
@ interface NSObject (Scheduler)

-( void )performSelector:( SEL )selector_
timeInterval:( NSTimeInterval )time_interval_
userInfo:( id )user_info_
repeats:( BOOL )repeats_;

@end

* This source code was highlighted with Source Code Highlighter .

рдкрд╣рд▓реЗ, рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд╕рд╛рде JFFScheduler рд╡рд░реНрдЧ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ:
//
typedef void (^JFFCancelScheduledBlock) ( void );
//
typedef void (^JFFScheduledBlock) ( JFFCancelScheduledBlock cancel_ );

@ interface JFFScheduler : NSObject

// ""
+(id)scheduler;

// " "
+(id)sharedScheduler;

//
// -
-(JFFCancelScheduledBlock)addBlock:( JFFScheduledBlock )block_
duration:( NSTimeInterval )duration_;

// , dealloc JFFScheduler
-( void )cancelAllScheduledOperations;

@end


* This source code was highlighted with Source Code Highlighter .

рд╡рд┐рдзрд┐ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди - (JFFCancelScheduledBlock) addBlock :( JFFScheduledBlock) block_ рдЕрд╡рдзрд┐ :( NSTimeInterval) period_
-(JFFCancelScheduledBlock)addBlock:( JFFScheduledBlock )block_
duration:( NSTimeInterval )duration_
{
//
JFFSimpleBlockHolder* cancel_block_holder_ = [ JFFSimpleBlockHolder simpleBlockHolder ];

block_ = [ [ block_ copy ] autorelease ];
// block_
// performBlock
void (^schedule_block_) ( void ) = [ [ ^
{
block_( cancel_block_holder_.simpleBlock );
} copy ] autorelease ];

// "target"
__block NSTimer* timer_ = [ NSTimer scheduledTimerWithTimeInterval: duration_
target: schedule_block_
selector: @selector( performBlock )
userInfo: nil
repeats: YES ];

__block NSObject* cancel_ptr_ = nil;
__block JFFScheduler* scheduler_ = self;

//
cancel_block_holder_.simpleBlock = ^
{
if ( scheduler_ )
{
[ timer_ invalidate ];
//
[ scheduler_.cancelBlocks removeObject: cancel_ptr_ ];
scheduler_ = nil;
}
};

cancel_ptr_ = (id)cancel_block_holder_.simpleBlock;
// dealloc
[ self.cancelBlocks addObject: cancel_ptr_ ];

return cancel_block_holder_.simpleBlock;
}


* This source code was highlighted with Source Code Highlighter .

JFFScheduler рд╡рд░реНрдЧ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рднреА рдХреЛрдбред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХрд┐ рд╕рдм рдХреБрдЫ рдХрд╛рдо рдХрд░реЗрдЧрд╛, рд╣рдореЗрдВ рдХреБрдЫ рдЕрддрд┐рд░рд┐рдХреНрдд рддрд░реАрдХреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА:
1. [[NSObject PerformBlock] - рдмреНрд▓реЙрдХ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдВ
@implementation NSObject (PerformBlock)

//
-( void )performBlock
{
void * self_ = self;
JFFSimpleBlock block_ = (JFFSimpleBlock)self_;
block_();
}

@end

//
[ ^ {
NSLog( @"test" );
} performBlock ];


* This source code was highlighted with Source Code Highlighter .

2. - [NSString рд╕рдВрдЦреНрдпрд╛ OfCharacterFromString:] рд╕реНрдЯреНрд░рд┐рдВрдЧ рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдЪрд░рд┐рддреНрд░ рдХреА рдШрдЯрдирд╛рдУрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ред рдПрдХ рдЙрджрд╛рд╣рд░рдг:
NSLog( @"num of \":\" - %d" , [ @":test:" numberOfCharacterFromString: @":" ] );

* This source code was highlighted with Source Code Highlighter .

рдкреНрд░рд┐рдВрдЯреНрд╕ - "рд╕рдВрдЦреНрдпрд╛:" - 2

3. - [NSObject addOnDeallocBlock:] - рдПрдХ рдРрд╕рд╛ рдмреНрд▓реЙрдХ рдЬреЛрдбрд╝реЗрдВ, рдЬрд┐рд╕реЗ рдорд╛рд▓рд┐рдХ рджреНрд╡рд╛рд░рд╛ рдореЗрдореЛрд░реА рд╕реЗ рд╣рдЯрд╛рдП рдЬрд╛рдиреЗ рдкрд░ (рдбреАрд▓реЙрдХ рд╡рд┐рдзрд┐ рдореЗрдВ) рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПред рдПрдХ рдЙрджрд╛рд╣рд░рдг:
NSObject* object_ = [ [ NSObject alloc ] init ];
[ object_ addOnDeallocBlock: ^
{
NSLog( @"test" );
} ];
// - test
[ object_ release ];


* This source code was highlighted with Source Code Highlighter .

рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╕рдм рдХреБрдЫ рд╣реИ рдЬрд┐рд╕реЗ рд╣рдореЗрдВ рдЕрдзреНрдпрд╛рдп рдХреЗ рдкреНрд░рд╛рдердорд┐рдХ рдХрд╛рд░реНрдп рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ - рдПрдХ рд╡рд┐рдзрд┐ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЬреЛ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕рдордп рдХреЗ рдмрд╛рдж рдПрдХ рдЖрд╕реНрдердЧрд┐рдд рдХреЙрд▓ рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИ, рдЬреЛ "рд▓рдХреНрд╖реНрдп" рдХреЗ рд▓рд┐рдП "рд░рд┐рдЯреЗрди" рдирд╣реАрдВ рдХрд╣рддрд╛ рд╣реИред рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди:
-( void )performSelector:( SEL )selector_
timeInterval:( NSTimeInterval )time_interval_
userInfo:( id )user_info_
repeats:( BOOL )repeats_
{
//
NSString* selector_string_ = NSStringFromSelector( selector_ );
NSUInteger num_of_args_ = [ selector_string_ numberOfCharacterFromString: @":" ];
NSString* assert_warning_ = [ NSString stringWithFormat: @"selector \"%@\" should has 0 or 1 parameters" , selector_string_ ];
NSAssert( num_of_args_ == 0 || num_of_args_ == 1, assert_warning_ );

// - __block self_ self
__block id self_ = self;

// scheduled ,
JFFScheduledBlock block_ = ^( JFFCancelScheduledBlock cancel_ )
{
//
if ( !repeats_ )
{
[ self_ removeOnDeallocBlock: cancel_ ];
cancel_();
}

//
num_of_args_ == 1
? objc_msgSend( self_, selector_, user_info_ )
: objc_msgSend( self_, selector_ );
};

JFFScheduler* scheduler_ = [ JFFScheduler sharedScheduler ];

//
JFFCancelScheduledBlock cancel_ = [ scheduler_ addBlock: block_
duration: time_interval_ ];
// scheduled self
[ self addOnDeallocBlock: cancel_ ];
}


* This source code was highlighted with Source Code Highlighter .

рдФрд░ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдЗрд╕ рдкрджреНрдзрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг:
SomeClass* object_ = [ [ SomeClass alloc ] init ];

// print
[ object_ performSelector: @selector( print )
timeInterval: 1.
userInfo: nil
repeats: NO ];

// release print ,
// object_
[ object_ release ];

* This source code was highlighted with Source Code Highlighter .

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

рдирд┐рд░рдВрддрд░рддрд╛: "рдмреНрд▓реЙрдХ рдкрд░ рдФрд░ рдЙрджреНрджреЗрд╢реНрдп-рд╕реА рднрд╛рдЧ 3 рдореЗрдВ рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ"

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


All Articles