SlideShare une entreprise Scribd logo
1  sur  41
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)() = ^() { //здесь падаем при обращении к date NSLog( @"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- googlecode ESBlocksRuntime–github
Управление памятью и Блоки
Automatic Reference CountingNocopy, release and autorelease
БлокиBest practice 1. Работа с контейнерами на примере NSArray 2. Охраняющиевыражения -guards 3. Отложенные вызовы: onDeallocBlock Scheduled operations 4. Блоки вместо делегатов в UIAlertView
NSArrayconcurrent enumerate NSArray* arr_ = [ NSArrayarrayWithObjects: @"1" , @"2”                    , @"3” , nil ]; [arr_ enumerateObjectsWithOptions: NSEnumerationConcurrent usingBlock: ^( idobj_                                , NSUIntegeridx_ , BOOL* stop_) { NSLog( @"start process: %@", obj_ ); sleep( 4 ); NSLog( @"stop process: %@", obj_ ); } ];
NSArrayСтрогая типизация vsNSPredicate NSArray* 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 )    { //updaterowshere if ( condition_ ) return; //updaterowshere    } ]; }
Отложенные вызовыonDeallocBlocks -(void)dealloc {    [ [ NSNotificationCenterdefaultCenter ] removeObserver: self ]; //release ivarshere if NO ARC    [ superdealloc ]; } ИЛИ -(void)dealloc {    [ selfcancelSomeOperations ]; //release ivarshere if NO ARC    [ superdealloc ]; }
Отложенные вызовыonDeallocBlocks 1. 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: nil afterDelay: 20. ]; [ NSObjectcancelPreviousPerformRequestsWithTarget: self ];//отмена ИЛИ [ NSTimerscheduledTimerWithTimeInterval: 20. target: self selector: @selector( someMethod ) userInfo: nil repeats: 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_ ] ) //.. }
Блоки вместо делегатов в UIAlertView JFFAlertButton* bt_ = [ JFFAlertButtonalertButton: title_ action: ^ { //do some action } ]; JFFAlertView* alert_view_ = [ JFFAlertViewalertWithTitle: @"Alert2" message: @"test" cancelButtonTitle: @"Cancel" otherButtonTitles: bt_, nil ];
Обобщенное асинхронное программирование 1. Асинхронная операция в общем виде 2. Кеширование 3. Порядок выполнения Дерево зависимостей, login Lazy load, вычитка страниц 4.Load balancer 5. Асинхронные операции в контексте сессии 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_ ) Login Logout
Легкий делегат {    [ 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: self didLoadImage: image_ error: error_ ]; } );
Легкий делегат ARC JFFAsyncOperation loader_ = …; weak idweak_delegate_ = delegate_; loader_( nil , nil , ^( idimage_ , NSError* error_ )  {      [ weak_delegate_ clip: self didLoadImage: image_ error: error_ ];  } );
Всем спасибо !!! Email:gorbenko.vova@gmail.com Skype: vova.gorbenko.mac

Contenu connexe

Tendances

Лекция #5. Введение в язык программирования Python 3
Лекция #5. Введение в язык программирования Python 3Лекция #5. Введение в язык программирования Python 3
Лекция #5. Введение в язык программирования Python 3Яковенко Кирилл
 
Статический анализ кода
Статический анализ кода Статический анализ кода
Статический анализ кода Pavel Tsukanov
 
Лекция 10. Классы 2.
Лекция 10. Классы 2.Лекция 10. Классы 2.
Лекция 10. Классы 2.Roman Brovko
 
Лекция 12. Быстрее, Python, ещё быстрее.
Лекция 12. Быстрее, Python, ещё быстрее.Лекция 12. Быстрее, Python, ещё быстрее.
Лекция 12. Быстрее, Python, ещё быстрее.Roman Brovko
 
Лекция 9. Модули, пакеты и система импорта.
Лекция 9. Модули, пакеты и система импорта.Лекция 9. Модули, пакеты и система импорта.
Лекция 9. Модули, пакеты и система импорта.Roman Brovko
 
Поговорим о JavaScript, основы и современные тенденции развития языка
Поговорим о JavaScript, основы и современные тенденции развития языкаПоговорим о JavaScript, основы и современные тенденции развития языка
Поговорим о JavaScript, основы и современные тенденции развития языкаAlexander Kucherenko
 
Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1Vasya Petrov
 
Производительность в Django
Производительность в DjangoПроизводительность в Django
Производительность в DjangoMoscowDjango
 
Лекция 2. Всё, что вы хотели знать о функциях в Python.
Лекция 2. Всё, что вы хотели знать о функциях в Python.Лекция 2. Всё, что вы хотели знать о функциях в Python.
Лекция 2. Всё, что вы хотели знать о функциях в Python.Roman Brovko
 
RDSDataSource: Чистые тесты на Swift
RDSDataSource: Чистые тесты на SwiftRDSDataSource: Чистые тесты на Swift
RDSDataSource: Чистые тесты на SwiftRAMBLER&Co
 
Selenium: приемы работы
Selenium: приемы работыSelenium: приемы работы
Selenium: приемы работыPaul Stashevsky
 
Лекция 3. Декораторы и модуль functools.
Лекция 3. Декораторы и модуль functools.Лекция 3. Декораторы и модуль functools.
Лекция 3. Декораторы и модуль functools.Roman Brovko
 
Влад Ковташ — Yap Database
Влад Ковташ — Yap DatabaseВлад Ковташ — Yap Database
Влад Ковташ — Yap DatabaseCocoaHeads
 
Лекция 13. Многопоточность и GIL
Лекция 13. Многопоточность и GILЛекция 13. Многопоточность и GIL
Лекция 13. Многопоточность и GILRoman Brovko
 
Лекция 11. Тестирование.
Лекция 11. Тестирование.Лекция 11. Тестирование.
Лекция 11. Тестирование.Roman Brovko
 
Профилирование и отладка Django
Профилирование и отладка DjangoПрофилирование и отладка Django
Профилирование и отладка DjangoVladimir Rudnyh
 
Лекция 8. Итераторы, генераторы и модуль itertools.
 Лекция 8. Итераторы, генераторы и модуль itertools. Лекция 8. Итераторы, генераторы и модуль itertools.
Лекция 8. Итераторы, генераторы и модуль itertools.Roman Brovko
 
Лекция 6. Классы 1.
Лекция 6. Классы 1.Лекция 6. Классы 1.
Лекция 6. Классы 1.Roman Brovko
 
Магия метаклассов
Магия метаклассовМагия метаклассов
Магия метаклассовAndrey Zakharevich
 
Делаем кроссбраузерные тесты поверх Webdriver
Делаем кроссбраузерные тесты поверх WebdriverДелаем кроссбраузерные тесты поверх Webdriver
Делаем кроссбраузерные тесты поверх WebdriverSQALab
 

Tendances (20)

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

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

Memory managment in i os
Memory managment in i osMemory managment in i os
Memory managment in i osit-park
 
Memory managment in i os (1)
Memory managment in i os (1)Memory managment in i os (1)
Memory managment in i os (1)it-park
 
Школа-студия разработки для iOS. Лекция 4. Работа с данными
Школа-студия разработки для iOS. Лекция 4. Работа с даннымиШкола-студия разработки для iOS. Лекция 4. Работа с данными
Школа-студия разработки для iOS. Лекция 4. Работа с даннымиГлеб Тарасов
 
ПВТ - осень 2014 - Лекция 7. Многопоточное программирование без блокировок. М...
ПВТ - осень 2014 - Лекция 7. Многопоточное программирование без блокировок. М...ПВТ - осень 2014 - Лекция 7. Многопоточное программирование без блокировок. М...
ПВТ - осень 2014 - Лекция 7. Многопоточное программирование без блокировок. М...Alexey Paznikov
 
Лекция 8. Intel Threading Building Blocks
Лекция 8. Intel Threading Building BlocksЛекция 8. Intel Threading Building Blocks
Лекция 8. Intel Threading Building BlocksMikhail Kurnosov
 
Hacking PostgreSQL. Локальная память процессов. Контексты памяти.
Hacking PostgreSQL. Локальная память процессов. Контексты памяти.Hacking PostgreSQL. Локальная память процессов. Контексты памяти.
Hacking PostgreSQL. Локальная память процессов. Контексты памяти.Anastasia Lubennikova
 
статический анализ кода
статический анализ кодастатический анализ кода
статический анализ кодаAndrey Karpov
 
Юнит-тестирование и Google Mock. Влад Лосев, Google
Юнит-тестирование и Google Mock. Влад Лосев, GoogleЮнит-тестирование и Google Mock. Влад Лосев, Google
Юнит-тестирование и Google Mock. Влад Лосев, Googleyaevents
 
Школа-Студия разработки приложений для iOS. 5 лекция. Разное
Школа-Студия разработки приложений для iOS. 5 лекция. РазноеШкола-Студия разработки приложений для iOS. 5 лекция. Разное
Школа-Студия разработки приложений для iOS. 5 лекция. РазноеГлеб Тарасов
 
C#. От основ к эффективному коду
C#. От основ к эффективному кодуC#. От основ к эффективному коду
C#. От основ к эффективному кодуVasiliy Deynega
 
CodeFest 2011. Крестьянинов М. — Обзор аспектно-ориентированного программиров...
CodeFest 2011. Крестьянинов М. — Обзор аспектно-ориентированного программиров...CodeFest 2011. Крестьянинов М. — Обзор аспектно-ориентированного программиров...
CodeFest 2011. Крестьянинов М. — Обзор аспектно-ориентированного программиров...CodeFest
 
[JAM 1.1] Clean Code (Paul Malikov)
[JAM 1.1] Clean Code (Paul Malikov)[JAM 1.1] Clean Code (Paul Malikov)
[JAM 1.1] Clean Code (Paul Malikov)Evgeny Kaziak
 
ПВТ - осень 2014 - Лекция 4 - Стандарт POSIX Threads. Реентерабельность. Сигн...
ПВТ - осень 2014 - Лекция 4 - Стандарт POSIX Threads. Реентерабельность. Сигн...ПВТ - осень 2014 - Лекция 4 - Стандарт POSIX Threads. Реентерабельность. Сигн...
ПВТ - осень 2014 - Лекция 4 - Стандарт POSIX Threads. Реентерабельность. Сигн...Alexey Paznikov
 
20140310 parallel programming_kalishenko_lecture03-04
20140310 parallel programming_kalishenko_lecture03-0420140310 parallel programming_kalishenko_lecture03-04
20140310 parallel programming_kalishenko_lecture03-04Computer Science Club
 
2012 03 14_parallel_programming_lecture05
2012 03 14_parallel_programming_lecture052012 03 14_parallel_programming_lecture05
2012 03 14_parallel_programming_lecture05Computer Science Club
 
Фундаментальные основы разработки под iOS. Павел Тайкало
Фундаментальные основы разработки под iOS. Павел ТайкалоФундаментальные основы разработки под iOS. Павел Тайкало
Фундаментальные основы разработки под iOS. Павел ТайкалоStanfy
 
DevConf. Дмитрий Сошников - ECMAScript 6
DevConf. Дмитрий Сошников - ECMAScript 6DevConf. Дмитрий Сошников - ECMAScript 6
DevConf. Дмитрий Сошников - ECMAScript 6Dmitry Soshnikov
 
Роман Ермолов - Отладка приложений под iOS
Роман Ермолов - Отладка приложений под iOSРоман Ермолов - Отладка приложений под iOS
Роман Ермолов - Отладка приложений под iOSAlexander Zimin
 
Хранение данных в iPhone. (FMDB, SQL-Persistence, CoreData)
Хранение данных в iPhone. (FMDB, SQL-Persistence, CoreData)Хранение данных в iPhone. (FMDB, SQL-Persistence, CoreData)
Хранение данных в iPhone. (FMDB, SQL-Persistence, CoreData)Yandex
 

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

Memory managment in i os
Memory managment in i osMemory managment in i os
Memory managment in i os
 
Memory managment in i os (1)
Memory managment in i os (1)Memory managment in i os (1)
Memory managment in i os (1)
 
Школа-студия разработки для iOS. Лекция 4. Работа с данными
Школа-студия разработки для iOS. Лекция 4. Работа с даннымиШкола-студия разработки для iOS. Лекция 4. Работа с данными
Школа-студия разработки для iOS. Лекция 4. Работа с данными
 
ПВТ - осень 2014 - Лекция 7. Многопоточное программирование без блокировок. М...
ПВТ - осень 2014 - Лекция 7. Многопоточное программирование без блокировок. М...ПВТ - осень 2014 - Лекция 7. Многопоточное программирование без блокировок. М...
ПВТ - осень 2014 - Лекция 7. Многопоточное программирование без блокировок. М...
 
Лекция 8. Intel Threading Building Blocks
Лекция 8. Intel Threading Building BlocksЛекция 8. Intel Threading Building Blocks
Лекция 8. Intel Threading Building Blocks
 
Hacking PostgreSQL. Локальная память процессов. Контексты памяти.
Hacking PostgreSQL. Локальная память процессов. Контексты памяти.Hacking PostgreSQL. Локальная память процессов. Контексты памяти.
Hacking PostgreSQL. Локальная память процессов. Контексты памяти.
 
статический анализ кода
статический анализ кодастатический анализ кода
статический анализ кода
 
Юнит-тестирование и Google Mock. Влад Лосев, Google
Юнит-тестирование и Google Mock. Влад Лосев, GoogleЮнит-тестирование и Google Mock. Влад Лосев, Google
Юнит-тестирование и Google Mock. Влад Лосев, Google
 
Школа-Студия разработки приложений для iOS. 5 лекция. Разное
Школа-Студия разработки приложений для iOS. 5 лекция. РазноеШкола-Студия разработки приложений для iOS. 5 лекция. Разное
Школа-Студия разработки приложений для iOS. 5 лекция. Разное
 
C#. От основ к эффективному коду
C#. От основ к эффективному кодуC#. От основ к эффективному коду
C#. От основ к эффективному коду
 
CodeFest 2011. Крестьянинов М. — Обзор аспектно-ориентированного программиров...
CodeFest 2011. Крестьянинов М. — Обзор аспектно-ориентированного программиров...CodeFest 2011. Крестьянинов М. — Обзор аспектно-ориентированного программиров...
CodeFest 2011. Крестьянинов М. — Обзор аспектно-ориентированного программиров...
 
[JAM 1.1] Clean Code (Paul Malikov)
[JAM 1.1] Clean Code (Paul Malikov)[JAM 1.1] Clean Code (Paul Malikov)
[JAM 1.1] Clean Code (Paul Malikov)
 
ПВТ - осень 2014 - Лекция 4 - Стандарт POSIX Threads. Реентерабельность. Сигн...
ПВТ - осень 2014 - Лекция 4 - Стандарт POSIX Threads. Реентерабельность. Сигн...ПВТ - осень 2014 - Лекция 4 - Стандарт POSIX Threads. Реентерабельность. Сигн...
ПВТ - осень 2014 - Лекция 4 - Стандарт POSIX Threads. Реентерабельность. Сигн...
 
20140310 parallel programming_kalishenko_lecture03-04
20140310 parallel programming_kalishenko_lecture03-0420140310 parallel programming_kalishenko_lecture03-04
20140310 parallel programming_kalishenko_lecture03-04
 
2012 03 14_parallel_programming_lecture05
2012 03 14_parallel_programming_lecture052012 03 14_parallel_programming_lecture05
2012 03 14_parallel_programming_lecture05
 
Фундаментальные основы разработки под iOS. Павел Тайкало
Фундаментальные основы разработки под iOS. Павел ТайкалоФундаментальные основы разработки под iOS. Павел Тайкало
Фундаментальные основы разработки под iOS. Павел Тайкало
 
DevConf. Дмитрий Сошников - ECMAScript 6
DevConf. Дмитрий Сошников - ECMAScript 6DevConf. Дмитрий Сошников - ECMAScript 6
DevConf. Дмитрий Сошников - ECMAScript 6
 
msumobi2. Лекция 2
msumobi2. Лекция 2msumobi2. Лекция 2
msumobi2. Лекция 2
 
Роман Ермолов - Отладка приложений под iOS
Роман Ермолов - Отладка приложений под iOSРоман Ермолов - Отладка приложений под iOS
Роман Ермолов - Отладка приложений под iOS
 
Хранение данных в iPhone. (FMDB, SQL-Persistence, CoreData)
Хранение данных в iPhone. (FMDB, SQL-Persistence, CoreData)Хранение данных в iPhone. (FMDB, SQL-Persistence, CoreData)
Хранение данных в iPhone. (FMDB, SQL-Persistence, CoreData)
 

Plus de e-Legion

MBLT16: Elena Rydkina, Pure
MBLT16: Elena Rydkina, PureMBLT16: Elena Rydkina, Pure
MBLT16: Elena Rydkina, Puree-Legion
 
MBLT16: Alexander Lukin, AppMetrica
MBLT16: Alexander Lukin, AppMetricaMBLT16: Alexander Lukin, AppMetrica
MBLT16: Alexander Lukin, AppMetricae-Legion
 
MBLT16: Vincent Wu, Alibaba Mobile
MBLT16: Vincent Wu, Alibaba MobileMBLT16: Vincent Wu, Alibaba Mobile
MBLT16: Vincent Wu, Alibaba Mobilee-Legion
 
MBLT16: Dmitriy Geranin, Afisha Restorany
MBLT16: Dmitriy Geranin, Afisha RestoranyMBLT16: Dmitriy Geranin, Afisha Restorany
MBLT16: Dmitriy Geranin, Afisha Restoranye-Legion
 
MBLT16: Marvin Liao, 500Startups
MBLT16: Marvin Liao, 500StartupsMBLT16: Marvin Liao, 500Startups
MBLT16: Marvin Liao, 500Startupse-Legion
 
MBLT16: Andrey Maslak, Aviasales
MBLT16: Andrey Maslak, AviasalesMBLT16: Andrey Maslak, Aviasales
MBLT16: Andrey Maslak, Aviasalese-Legion
 
MBLT16: Andrey Bakalenko, Sberbank Online
MBLT16: Andrey Bakalenko, Sberbank OnlineMBLT16: Andrey Bakalenko, Sberbank Online
MBLT16: Andrey Bakalenko, Sberbank Onlinee-Legion
 
Rx Java architecture
Rx Java architectureRx Java architecture
Rx Java architecturee-Legion
 
MBLTDev15: Hector Zarate, Spotify
MBLTDev15: Hector Zarate, SpotifyMBLTDev15: Hector Zarate, Spotify
MBLTDev15: Hector Zarate, Spotifye-Legion
 
MBLTDev15: Cesar Valiente, Wunderlist
MBLTDev15: Cesar Valiente, WunderlistMBLTDev15: Cesar Valiente, Wunderlist
MBLTDev15: Cesar Valiente, Wunderliste-Legion
 
MBLTDev15: Brigit Lyons, Soundcloud
MBLTDev15: Brigit Lyons, SoundcloudMBLTDev15: Brigit Lyons, Soundcloud
MBLTDev15: Brigit Lyons, Soundcloude-Legion
 
MBLTDev15: Egor Tolstoy, Rambler&Co
MBLTDev15: Egor Tolstoy, Rambler&CoMBLTDev15: Egor Tolstoy, Rambler&Co
MBLTDev15: Egor Tolstoy, Rambler&Coe-Legion
 
MBLTDev15: Alexander Orlov, Postforpost
MBLTDev15: Alexander Orlov, PostforpostMBLTDev15: Alexander Orlov, Postforpost
MBLTDev15: Alexander Orlov, Postforposte-Legion
 
MBLTDev15: Artemiy Sobolev, Parallels
MBLTDev15: Artemiy Sobolev, ParallelsMBLTDev15: Artemiy Sobolev, Parallels
MBLTDev15: Artemiy Sobolev, Parallelse-Legion
 
MBLTDev15: Alexander Dimchenko, DIT
MBLTDev15: Alexander Dimchenko, DITMBLTDev15: Alexander Dimchenko, DIT
MBLTDev15: Alexander Dimchenko, DITe-Legion
 
MBLTDev: Evgeny Lisovsky, Litres
MBLTDev: Evgeny Lisovsky, LitresMBLTDev: Evgeny Lisovsky, Litres
MBLTDev: Evgeny Lisovsky, Litrese-Legion
 
MBLTDev: Alexander Dimchenko, Bright Box
MBLTDev: Alexander Dimchenko, Bright Box MBLTDev: Alexander Dimchenko, Bright Box
MBLTDev: Alexander Dimchenko, Bright Box e-Legion
 
MBLTDev15: Konstantin Goldshtein, Microsoft
MBLTDev15: Konstantin Goldshtein, MicrosoftMBLTDev15: Konstantin Goldshtein, Microsoft
MBLTDev15: Konstantin Goldshtein, Microsofte-Legion
 
MBLTDev15: Anna Mikhina, Maxim Evdokimov, Tinkoff Bank
MBLTDev15: Anna Mikhina, Maxim Evdokimov, Tinkoff Bank MBLTDev15: Anna Mikhina, Maxim Evdokimov, Tinkoff Bank
MBLTDev15: Anna Mikhina, Maxim Evdokimov, Tinkoff Bank e-Legion
 

Plus de e-Legion (20)

MBLT16: Elena Rydkina, Pure
MBLT16: Elena Rydkina, PureMBLT16: Elena Rydkina, Pure
MBLT16: Elena Rydkina, Pure
 
MBLT16: Alexander Lukin, AppMetrica
MBLT16: Alexander Lukin, AppMetricaMBLT16: Alexander Lukin, AppMetrica
MBLT16: Alexander Lukin, AppMetrica
 
MBLT16: Vincent Wu, Alibaba Mobile
MBLT16: Vincent Wu, Alibaba MobileMBLT16: Vincent Wu, Alibaba Mobile
MBLT16: Vincent Wu, Alibaba Mobile
 
MBLT16: Dmitriy Geranin, Afisha Restorany
MBLT16: Dmitriy Geranin, Afisha RestoranyMBLT16: Dmitriy Geranin, Afisha Restorany
MBLT16: Dmitriy Geranin, Afisha Restorany
 
MBLT16: Marvin Liao, 500Startups
MBLT16: Marvin Liao, 500StartupsMBLT16: Marvin Liao, 500Startups
MBLT16: Marvin Liao, 500Startups
 
MBLT16: Andrey Maslak, Aviasales
MBLT16: Andrey Maslak, AviasalesMBLT16: Andrey Maslak, Aviasales
MBLT16: Andrey Maslak, Aviasales
 
MBLT16: Andrey Bakalenko, Sberbank Online
MBLT16: Andrey Bakalenko, Sberbank OnlineMBLT16: Andrey Bakalenko, Sberbank Online
MBLT16: Andrey Bakalenko, Sberbank Online
 
Rx Java architecture
Rx Java architectureRx Java architecture
Rx Java architecture
 
Rx java
Rx javaRx java
Rx java
 
MBLTDev15: Hector Zarate, Spotify
MBLTDev15: Hector Zarate, SpotifyMBLTDev15: Hector Zarate, Spotify
MBLTDev15: Hector Zarate, Spotify
 
MBLTDev15: Cesar Valiente, Wunderlist
MBLTDev15: Cesar Valiente, WunderlistMBLTDev15: Cesar Valiente, Wunderlist
MBLTDev15: Cesar Valiente, Wunderlist
 
MBLTDev15: Brigit Lyons, Soundcloud
MBLTDev15: Brigit Lyons, SoundcloudMBLTDev15: Brigit Lyons, Soundcloud
MBLTDev15: Brigit Lyons, Soundcloud
 
MBLTDev15: Egor Tolstoy, Rambler&Co
MBLTDev15: Egor Tolstoy, Rambler&CoMBLTDev15: Egor Tolstoy, Rambler&Co
MBLTDev15: Egor Tolstoy, Rambler&Co
 
MBLTDev15: Alexander Orlov, Postforpost
MBLTDev15: Alexander Orlov, PostforpostMBLTDev15: Alexander Orlov, Postforpost
MBLTDev15: Alexander Orlov, Postforpost
 
MBLTDev15: Artemiy Sobolev, Parallels
MBLTDev15: Artemiy Sobolev, ParallelsMBLTDev15: Artemiy Sobolev, Parallels
MBLTDev15: Artemiy Sobolev, Parallels
 
MBLTDev15: Alexander Dimchenko, DIT
MBLTDev15: Alexander Dimchenko, DITMBLTDev15: Alexander Dimchenko, DIT
MBLTDev15: Alexander Dimchenko, DIT
 
MBLTDev: Evgeny Lisovsky, Litres
MBLTDev: Evgeny Lisovsky, LitresMBLTDev: Evgeny Lisovsky, Litres
MBLTDev: Evgeny Lisovsky, Litres
 
MBLTDev: Alexander Dimchenko, Bright Box
MBLTDev: Alexander Dimchenko, Bright Box MBLTDev: Alexander Dimchenko, Bright Box
MBLTDev: Alexander Dimchenko, Bright Box
 
MBLTDev15: Konstantin Goldshtein, Microsoft
MBLTDev15: Konstantin Goldshtein, MicrosoftMBLTDev15: Konstantin Goldshtein, Microsoft
MBLTDev15: Konstantin Goldshtein, Microsoft
 
MBLTDev15: Anna Mikhina, Maxim Evdokimov, Tinkoff Bank
MBLTDev15: Anna Mikhina, Maxim Evdokimov, Tinkoff Bank MBLTDev15: Anna Mikhina, Maxim Evdokimov, Tinkoff Bank
MBLTDev15: Anna Mikhina, Maxim Evdokimov, Tinkoff Bank
 

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

Notes de l'éditeur

  1. Еще сложнее если два алерта