SlideShare a Scribd company logo
Objective-C Блоки (Block)
Типилитерал блокаtypedefint (^MyBlock)(int);intmultiplier = 7;MyBlockmyBlock = ^(intnum) {returnnum * multiplier;};ИЛИintmultiplier = 7;int(^myBlock)(int) = ^(intnum) {return num * multiplier;};
Вызов блока{...myBlock( 3);//илиif ( myBlock )myBlock( 3 );}Результат: 21
Контекст блока1. примитивные типыint multiplier = 7;int(^myBlock)(int) = ^(intnum) {return num * multiplier;};multiplier = 8;NSLog( @"%d", myBlock( 3 ) );Печатает: 21
Контекст блока2. ключевое слово __block__blockint multiplier = 7;int(^myBlock)(int) = ^(intnum) {return num * multiplier;}; multiplier = 8;NSLog( @"%d", myBlock( 3 ) );Печатает:24
Контекст блока3. переменные – указатели на объекты с подсчетом ссылок (id, NSObject)NSDate* date = [ [ NSDate alloc ] init ];void(^printDate)() = ^() {NSLog( @"date: %@", date );};//копируем блок в кучуprintDate = [ [ printDatecopy ] autorelease ];[ date release ];printDate();
Контекст блока4a. управление памятьюNSDate* date = [ [ NSDate alloc ] init ];//создаем блок в стекеvoid(^printDate)() = ^() {NSLog( @"date: %@", date );};[ date release ];//копируем блок в кучу и падаемprintDate = [ [ printDatecopy ] autorelease ];
Контекст блока4b. управление памятью__blockNSDate* date = [ [ NSDatealloc ] init ];void(^printDate)() = ^() {//здесь падаем при обращении к dateNSLog( @"date: %@", date );};//копируем блок в кучу, для объекта dateretain не вызываетсяprintDate= [ [ printDatecopy ] autorelease ];[ date release ];printDate();
Блоки и управление памятью1. отложенный вызовvoid (^printDate)() = ^() {NSLog( @”Hello”); };//добавление в контейнерprintDate = [ [ printDatecopy ] autorelease ];[ NSMutableArrayarrayWithObject: printDate];self.simpleBlock = printDate;//всегда копируем block property@property( copy ) JFFSimpleBlocksimpleBlock;
Блоки и управление памятью2. block как результат функции-(JFFSimpleBlock)example{return [ [ ^   {NSLog( @"test" );   } copy ] autorelease ];}
Блоки и управление памятью3. Виды блоковых объектовГлобальные- без состоянияЛокальные- в стекеMalloc- Блоки в кучеIos < 4.0 support:PLBlocks- googlecodeESBlocksRuntime–github
Управление памятью и Блоки
Automatic Reference CountingNocopy, release and autorelease
БлокиBest practice1. Работа с контейнерами на примере NSArray2. Охраняющиевыражения -guards3. Отложенные вызовы:onDeallocBlockScheduled operations4. Блоки вместо делегатов в UIAlertView
NSArrayconcurrent enumerateNSArray* arr_ = [ NSArrayarrayWithObjects: @"1", @"2”                   , @"3”, nil ];[arr_ enumerateObjectsWithOptions: NSEnumerationConcurrentusingBlock: ^( idobj_                               , NSUIntegeridx_, BOOL* stop_){NSLog( @"start process: %@", obj_ );sleep( 4 );NSLog( @"stop process: %@", obj_ );} ];
NSArrayСтрогая типизация vsNSPredicateNSArray* array_ = [ NSArrayarrayWithObjects: @"1"                      , @"2"                      , @"3"                      , nil ];[ array_ indexOfObjectPassingTest: ^( idobj_	                               , NSUIntegeridx_ , BOOL* stop_){NSString* element_ = obj_;return[ element_ isEqualToString: @"2" ];} ];
JFFLibrirary’sNSArrayрасширенияJFFLibrirarygithub+(id)arrayWithSize:( NSUInteger )size_          producer:( ProducerBlock )block_;-(void)each:( ActionBlock )block_;-(NSArray*)map:( MappingBlock )block_;-(NSArray*)select:( PredicateBlock )predicate_;-(NSArray*)flatten:( FlattenBlock )block_;-(NSUInteger)count:( PredicateBlock )predicate_;-(id)firstMatch:( PredicateBlock )predicate_;-(void)transformWithArray:( NSArray* )other_withBlock:( TransformBlock )block_;
Охраняющиевыражения–guards{  [ selfbeginUpdates ];   //update rows here//здесь ошибка если condition_ == true, мы не вызовем endUpdates   if( condition_ )return;   //update rows here   [ selfendUpdates ];}
Охраняющиевыражения –guards-(void)withinUpdates:( void (^)( void ) )block_{   [ selfbeginUpdates ];@try   {block_();   }@finally   {      [ selfendUpdates ];   }}
Охраняющиевыражения –guards{   [ self.tableViewwithinUpdates: ^( void )   {//updaterowshereif ( condition_ )return;//updaterowshere   } ];}
Отложенные вызовыonDeallocBlocks-(void)dealloc{   [ [ NSNotificationCenterdefaultCenter ] removeObserver: self ];//release ivarshere if NO ARC   [ superdealloc ];}ИЛИ-(void)dealloc{   [ selfcancelSomeOperations ];//release ivarshere if NO ARC   [ superdealloc ];}
Отложенные вызовыonDeallocBlocks1. objc_setAssociatedObject( self, &ownerships_key_, ownerships_, RETAIN_NONATOMIC);2. Class JFFOnDeallocBlockOwner-(void)dealloc{if ( _block )   {_block();      [ _blockrelease ];   }   [ superdealloc ];}
Отложенные вызовыonDeallocBlocks-(void)addOnDeallocBlock:( void(^)( void ) )block_{JFFOnDeallocBlockOwner* owner_ = [ [ JFFOnDeallocBlockOwneralloc] initWithBlock: block_ ];[ self.ownershipsaddObject: owner_ ];[ owner_ release ];}
Отложенные вызовыonDeallocBlocks //лечим циклическую ссылку__blockid self_ = self;[ selfaddOnDeallocBlock: ^{[ [ NSNotificationCenterdefaultCenter ] removeObserver: self_ ];} ];
Отложенные вызовыScheduled operations [ selfperformSelector: @selector( someMethod )withObject: nilafterDelay: 20. ];[ NSObjectcancelPreviousPerformRequestsWithTarget: self ];//отменаИЛИ[ NSTimerscheduledTimerWithTimeInterval: 20.target: selfselector: @selector( someMethod )userInfo: nilrepeats: YES ]; [ timer_ invalidate ]; //отмена
Отложенные вызовыScheduled operations__blockid self_ = self;JFFScheduledBlockbk_= ^{ [ self_ someMethod ];}CancelBlockcancel_ = [ JFFScheduleraddBlock: bk_duration: 20. ]; [ selfaddOnDeallocBlock: cancel_  ];
Блоки вместо делегатов в UIAlertView-(void)alertView:( UIAlertView* )alert_view_ clickedButtonAtIndex:( NSInteger )button_index_{NSString* title_ = [ alert_view_ buttonTitleAtIndex: button_index_ ];if( [title_ isEqualToString: cancel_ ] )//..elseif ( [ title_ isEqualToString: button1_ ] )//..elseif ( [ title_ isEqualToString: button2_ ] )//..}
Блоки вместо делегатов в UIAlertViewJFFAlertButton* bt_ = [ JFFAlertButtonalertButton: title_action: ^{//do some action} ];JFFAlertView* alert_view_ =[ JFFAlertViewalertWithTitle: @"Alert2"message: @"test"cancelButtonTitle: @"Cancel"otherButtonTitles: bt_, nil ];
Обобщенное асинхронное программирование1. Асинхронная операция в общем виде2. Кеширование3. Порядок выполненияДерево зависимостей, loginLazy load, вычитка страниц4.Load balancer5. Асинхронные операции в контексте сессии6. Асинхронные операции в UI
Асинхронная операция в общем видеCancelBlock(^AsyncOperation)         ( ProgressHandler, CancelHandler          , FinishHandler) { … };
КешированиеЛогический запрос 1Логический запрос 2ФизическийзапросОтвет 1Ответ 2
Кэширование,API//физическийзапросJFFAsyncOperationdata_loader_ = ...;//кэшированный запросJFFAsyncOperationcached_loader_ =[ selfasyncOperationForPropertyWithName: @”image”asyncOperation: data_loader_ ];
Порядоквыполнения -последовательностьsequence_ = sequenceOfAsyncOperations( operation1_                 , operation2_			, nil );Асинхронная операция как последовательность…Асин. оп.1Асин. оп.2Асин. Оп.N
Порядоквыполнения -группаgroup_ = groupOfAsyncOperations( operation1_                  , operation2_			, nil );Запрос 1Запрос 2Запрос 3Группа запросов
Порядоквыполнения –графленивыевычисленияJFFAsyncOperationother_pages_ = ^( callbacks_ ){NSArray* loaders_ = …;      result_ = groupOfAsyncOp( loaders_ );returnresult_( callbacks_ );};sequenceOfAsyncOperations( first_page_                        , other_pages_                        , nil );
Loadbalancer//имя текущего контекстаvoidsetBalancerActiveContextName( NSString* name_ );//сбалансированная асинхронная операцияbalanced_loader_ = balancedAsyncOperation( loader_ );
Запросы и сессияsafe_loader_ =checkSessionForLoaderBlock( loader_ )LoginLogout
Легкий делегат{   [ self.clipasyncImageWithWeakDelegate: self ];}#pragma mark ClipDelegate -(void)clip:( Clip* )clip_didLoadImage:( UIImage* )image_error:( NSError* )error_{if ( self.clip!= clip_ )return;self.imageView.image= image_;}
Легкий делегатJFFAsyncOperationloader_ = …;__blockidweak_delegate_ = delegate_;[ weak_delegate_ weakAsyncOperation: loader_ ]( nil, nil, ^( idimage_, NSError* error_ ){[ weak_delegate_ clip: selfdidLoadImage: image_error: error_ ];} );
Легкий делегат ARCJFFAsyncOperation loader_ = …;weak idweak_delegate_ = delegate_;loader_( nil, nil, ^( idimage_, NSError* error_ ) {     [ weak_delegate_ clip: selfdidLoadImage: image_error: error_ ]; } );
Всем спасибо !!!Email:gorbenko.vova@gmail.comSkype: vova.gorbenko.mac

More Related Content

PDF
Decorators' recipes
PPTX
Григорий Демченко, Универсальный адаптер
PPTX
Bytecode
PPTX
Максим Щепелин. "Unittesting. Как?"
PPT
Подробная презентация JavaScript 6 в 1
PDF
PVS-Studio в 2021 - Примеры ошибок
PPTX
PDF
Асинхронный JavaScript
Decorators' recipes
Григорий Демченко, Универсальный адаптер
Bytecode
Максим Щепелин. "Unittesting. Как?"
Подробная презентация JavaScript 6 в 1
PVS-Studio в 2021 - Примеры ошибок
Асинхронный JavaScript

What's hot (20)

PDF
Лекция #5. Введение в язык программирования Python 3
PPTX
Статический анализ кода
PDF
Лекция 10. Классы 2.
PDF
Лекция 12. Быстрее, Python, ещё быстрее.
PDF
Лекция 9. Модули, пакеты и система импорта.
PPTX
Поговорим о JavaScript, основы и современные тенденции развития языка
PPT
Подробная презентация JavaScript 6 в 1
PPT
Производительность в Django
PDF
Лекция 2. Всё, что вы хотели знать о функциях в Python.
PDF
RDSDataSource: Чистые тесты на Swift
PPTX
Selenium: приемы работы
PDF
Лекция 3. Декораторы и модуль functools.
PDF
Влад Ковташ — Yap Database
PDF
Лекция 13. Многопоточность и GIL
PDF
Лекция 11. Тестирование.
PDF
Профилирование и отладка Django
PDF
Лекция 8. Итераторы, генераторы и модуль itertools.
PDF
Лекция 6. Классы 1.
PDF
Магия метаклассов
PDF
Делаем кроссбраузерные тесты поверх Webdriver
Лекция #5. Введение в язык программирования Python 3
Статический анализ кода
Лекция 10. Классы 2.
Лекция 12. Быстрее, Python, ещё быстрее.
Лекция 9. Модули, пакеты и система импорта.
Поговорим о JavaScript, основы и современные тенденции развития языка
Подробная презентация JavaScript 6 в 1
Производительность в Django
Лекция 2. Всё, что вы хотели знать о функциях в Python.
RDSDataSource: Чистые тесты на Swift
Selenium: приемы работы
Лекция 3. Декораторы и модуль functools.
Влад Ковташ — Yap Database
Лекция 13. Многопоточность и GIL
Лекция 11. Тестирование.
Профилирование и отладка Django
Лекция 8. Итераторы, генераторы и модуль itertools.
Лекция 6. Классы 1.
Магия метаклассов
Делаем кроссбраузерные тесты поверх Webdriver
Ad

Similar to Владимир Горбенко «Использование блоков в Objective-C» (20)

PPT
Memory managment in i os (1)
PPT
Memory managment in i os
PDF
iOS-07_2 Multithreading
PDF
Школа-студия разработки для iOS. Лекция 4. Работа с данными
PDF
iOS-01-Основы Objective-C
PDF
iOS-07_1 Objective-C Blocks
PDF
Фундаментальные основы разработки под iOS. Павел Тайкало
PDF
msumobi2. Лекция 2
PDF
Школа-студия разработки приложений для iOS. Лекция 1. Objective-C
PPTX
Как пройти собеседование и получить первую работу на Swift
PDF
Squeek 1
PDF
Интуит. Разработка приложений для iOS. Лекция 8. Работа с данными
PDF
7 кашкута
PDF
Перспективы функционального подхода
PDF
msumobi2. Лекция 1
PDF
Школа-студия разработки приложений для iOS. 2 лекция. MVC, View, Controllers
PDF
2-е занятие курса iPhone разработки в ГУ-ВШЭ
PDF
Интуит. Разработка приложений для iOS. Лекция 2. Objective-C
PDF
Lviv MDDay 2014. Андріан Буданцов “Внутрішній світ iOS додатків”
KEY
Курсы по мобильной разработке. 1 лекция. Знакомство с iOS
Memory managment in i os (1)
Memory managment in i os
iOS-07_2 Multithreading
Школа-студия разработки для iOS. Лекция 4. Работа с данными
iOS-01-Основы Objective-C
iOS-07_1 Objective-C Blocks
Фундаментальные основы разработки под iOS. Павел Тайкало
msumobi2. Лекция 2
Школа-студия разработки приложений для iOS. Лекция 1. Objective-C
Как пройти собеседование и получить первую работу на Swift
Squeek 1
Интуит. Разработка приложений для iOS. Лекция 8. Работа с данными
7 кашкута
Перспективы функционального подхода
msumobi2. Лекция 1
Школа-студия разработки приложений для iOS. 2 лекция. MVC, View, Controllers
2-е занятие курса iPhone разработки в ГУ-ВШЭ
Интуит. Разработка приложений для iOS. Лекция 2. Objective-C
Lviv MDDay 2014. Андріан Буданцов “Внутрішній світ iOS додатків”
Курсы по мобильной разработке. 1 лекция. Знакомство с iOS
Ad

More from e-Legion (20)

PPTX
MBLT16: Elena Rydkina, Pure
PPTX
MBLT16: Alexander Lukin, AppMetrica
PPTX
MBLT16: Vincent Wu, Alibaba Mobile
PPTX
MBLT16: Dmitriy Geranin, Afisha Restorany
PPTX
MBLT16: Marvin Liao, 500Startups
PDF
MBLT16: Andrey Maslak, Aviasales
PDF
MBLT16: Andrey Bakalenko, Sberbank Online
PPTX
Rx Java architecture
PPTX
Rx java
PDF
MBLTDev15: Hector Zarate, Spotify
PDF
MBLTDev15: Cesar Valiente, Wunderlist
PDF
MBLTDev15: Brigit Lyons, Soundcloud
PDF
MBLTDev15: Egor Tolstoy, Rambler&Co
PDF
MBLTDev15: Alexander Orlov, Postforpost
PDF
MBLTDev15: Artemiy Sobolev, Parallels
PPTX
MBLTDev15: Alexander Dimchenko, DIT
PPTX
MBLTDev: Evgeny Lisovsky, Litres
PPTX
MBLTDev: Alexander Dimchenko, Bright Box
PPTX
MBLTDev15: Konstantin Goldshtein, Microsoft
PDF
MBLTDev15: Anna Mikhina, Maxim Evdokimov, Tinkoff Bank
MBLT16: Elena Rydkina, Pure
MBLT16: Alexander Lukin, AppMetrica
MBLT16: Vincent Wu, Alibaba Mobile
MBLT16: Dmitriy Geranin, Afisha Restorany
MBLT16: Marvin Liao, 500Startups
MBLT16: Andrey Maslak, Aviasales
MBLT16: Andrey Bakalenko, Sberbank Online
Rx Java architecture
Rx java
MBLTDev15: Hector Zarate, Spotify
MBLTDev15: Cesar Valiente, Wunderlist
MBLTDev15: Brigit Lyons, Soundcloud
MBLTDev15: Egor Tolstoy, Rambler&Co
MBLTDev15: Alexander Orlov, Postforpost
MBLTDev15: Artemiy Sobolev, Parallels
MBLTDev15: Alexander Dimchenko, DIT
MBLTDev: Evgeny Lisovsky, Litres
MBLTDev: Alexander Dimchenko, Bright Box
MBLTDev15: Konstantin Goldshtein, Microsoft
MBLTDev15: Anna Mikhina, Maxim Evdokimov, Tinkoff Bank

Владимир Горбенко «Использование блоков в Objective-C»

Editor's Notes

  • #28: Еще сложнее если два алерта