среда, 17 октября 2012 г.

ARC и [[self retain] autorelease]


Иногда нужно быть уверенным, что объект просуществует как минимум до конца собственного вызванного метода. 
До ARC мы обычно писали в таких случаях [[self retain] autorelease]; (выглядит не очень приятно, согласен), но ARC в числе прочих забот принес и необходимость ввести какую-то замену этому способу.
Думаю, когда обычные разработчики оказываются перед подобной проблемой, они обычно спрашивают себя: "А что бы сделали разработчики из Apple?". К счастью, в данном случае разработчики Apple продемонстрировали свой вариант решения проблемы, на который я наткнулся просматривая обновленный код демо-проекта SimplePing.
Дабы не быть голословным приведу просто код. 
Итак, в теле метода, где self должен гарантированно существовать на момент завершения вызова метода:

 [self performSelector:@selector(noop) withObject:nil afterDelay:0.0];

Само же описание метода феноменально:
- (void)noop
{

}

Ну что ж, ребятам, которые знают, что происходит "под капотом" можно верить, а немного подумав можно прийти к выводу, что все вполне разумно. Но лично я бы нескоро до этого догадался.

четверг, 4 октября 2012 г.

Выстрелить в ногу на Objective-C

Поскольку Objective-C в корне своем - С, то можно просто выстрелить себе в ногу. Но это неинтересно.

Архитектурно задача выглядит следующим образом: объект класса "Пистолет" получает сообщение "сделатьВыстрелВ:" с параметром - объект класса "Нога".

Вспоминаем, что Нога не отвечает протоколу "ОбъектКоторыйМожетБытьЦельюВыстрела". Создаем протокол, прописываем реализацию обязательного метода "получилаВыстрел:".

Запускаем. Работает, но остается патрон на полу. Прибираемся. Вспоминаем времена до ARC, когда за уборкой каждого патрона приходилось следить самому. Ворчим на новое поколение стреляющих, которые не застали эти славные времена, поэтому управление патронами не понимают, в результате чего в случае появления патрона часто не знают, что делать вообще. 

Визуализируем. Для объектов создаем по несколько типов изображений: одно для iPhone, второе для iPhone с Retina-экраном, третье для нового iPhone c вытянутым экраном и еще одно для iPad. 

Следуя концепции MVC пишем контроллер - курок.

Портируем версию на Mac Os X (у всех классов интерфейса заменяем префикс UI на NS) . За время, пока мы пишем - выходит новое видео с WWDC, после просмотра которого оказывается, что в новой операционной системе есть библиотека выстрелов с картинками, методами и отличной документацией, а в разделе для разработчиков на сайте Apple есть проект-пример, в котором демонстрируется как выстрелить не только в ногу и не только себе. Плачем, потому что надо поддерживать iOS предыдущей версии. Видит око, да зуб неймет. Думаем, где взять время, чтобы посмотреть хотя бы половину роликов с новой конференции, когда еще с прошлой штук десять непросмотренных осталось.

Выходит новая операционная система и Xcode. Разработка замедляется - среда разработки явно работает медленнее, более требовательная операционная система подливает масла в огонь. Долгожданной функции вставки заголовков отсутствующих обязательных методов протокола в класс, который объявлен поддерживающим этот протокол все еще нет.

Вспоминаешь, как много написано, решаешь закоммитить проект. Синхронизируешь с github. Во время синхронизации Xcode сбоит и запарывает проект. С мыслями о том, что для лузеров как ты была, есть и будет теплая ламповая консоль, через которую и надо работать с git, берешь настоящий пистолет и тестируешь проект в реальных условиях с поправкой на голову вместо ноги.

@end