Показаны сообщения с ярлыком Неочевидно. Показать все сообщения
Показаны сообщения с ярлыком Неочевидно. Показать все сообщения

понедельник, 21 января 2013 г.

Sometimes "\n" is just "\n"

Usually we use "\n" to make a line break in NSString object. But in -description override "\n" stay "\n".
It's not very good if you want to show an object series or whatever. In this case you may use "\r" to make a line break. 
Some extra info on Stackoverflow.

среда, 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
{

}

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

понедельник, 10 сентября 2012 г.

Недолгий век UISearchDisplayController


Объект UISearchDisplayController инициализируется вызовом initWithSearchBar:contentsController:. Как видно из названия метода и документации, работающему контроллеру необходимо задать searchBar и contentController, в виде которого будет отображаться таблица с результатами поиска.
Покопавшись в документации UIViewController мы также увидим read-only свойство searchDisplayController.
Это значит, что мы не можем задать нашему основному контроллеру searchDisplayController напрямую, вместо этого мы должны инициализировать объект UISearchDisplayController с основным контроллером.
Ситуация стандартная, таким же образом мы действуем, когда создаем UINavigationController - не назначаем его основному контроллеру, а инициируем объект UINavigationController с основным контроллером.
Что может ввести в заблуждение, так это то, что обладание ссылкой searchDisplayController достаточно для работы. Но это не так, потому что во избежание зацикливания ссылок контроллеров друг на друга объект UISearchDisplayController "умирает" спустя некоторое время после создания.
Говоря проще, создавая UISearchDisplayController во viewDidLoad вы теряете его сразу по завершению метода.
Выход прост: создать отдельное strong-свойство в основном контроллере для объекта UISearchDisplayController. Правда, остается непонятным, зачем тогда вообще ссылка searchDisplayController - ведь в отличие от UINavigationController он связан только с одним контроллером за раз.