Pull to refresh

Comments 13

Спасибо, исправил, но есть же хабрапочта)
> проследив иерархию классов, выяснить, какие подклассы наследуются из данного класса. Это дает вам возможность писать подклассы, которые будут отвечать за специфичиские форматы данных, или что-то в этом роде, и потом дать суперклассу возможность находить их самому, избавив себя от утомительной необходимости регистрировать их все руками.

Всегда надеялся, что линкер или оптимизирующий компилятор выбрасывают неиспользуемый код, и в исполняемый файл попадает код только используемых функций и классов, т.е. если импортировать какую-нибудь библиотеку с тысячей функций, и использовать только одну из них, то только эта одна функция и будет включена в итоговый исполняемый файл.
Но возможно, это экономия на спичках в наше время терабайтовых жёстких дисков и гигабайтов оперативной памяти.
Я тоже не так давно задался этим вопросом, оказалось, что компилятор не производит такого уровня оптимизации.
У iPhone опертаивная память имеет ограничения, поэтому не сказал бы, что это экономия на спичках.
такая оптимизация в ObjC нерелевантна и невозможна.
Я уже не представляю как можно кодить без Runtime API, он действительно открывает огромнейшие возможности, так что если кто еще не начал его юзать — очень советую.
Прям классы на лету создаёте? Или больше интроспекцией занимаетесь?
Да всего по чуть-чуть, вот в этом проекте все построено на мощи Runtime.
Классы на лету только инстанциировал, но новый класс не добавлял.
Самый банальный пример удобного использования ObjC Runtime это замена switch'ей.
Допустим нам надо основываясь на каком-то выборе отображать конкретный контроллер, в случае без гибкого рантайма пришлось бы использовать switch, а в случае с ObjC можно делать все просто и красиво

const char * const controllers[] = {"Foo", "Bar", "Bazz"};
...
//  index - индекс ячейки в таблице, или тэг на кнопке
NSString *controllerName = [NSString stringWithFormat:@"%sViewController", controllers[index]];
UIViewController *viewController = [NSClassFormString(controllerName) new];


и все, никаких свитчей, минимум кода.

А вообще там есть гораздо больше плюх и удобств.
Да, красиво, особенно, если возможных вариантов больше десятка)
*конечно не православно, но всё же*
Методика очень удобная, постоянно использую, когда работаю над ActionScript проектами:

const classes : Vector.<Class> = new <Class>[ FooController, BarController, BazzController ];
var controller : IViewController = new ( classes[ index ] )( );


это когда список классов заранее известен. Так же есть прекрасные вещи в стиле:

function addParticle(particleClassName : String = "DefaultParticle") : void
{
    addChild( new ( ApplicationDomain.currentDomain.getDefinition( particleClassName ) )() );
}


честно признать, не знал, что в ObjC оно тоже есть, буду пользоваться:) Спасибо!
Офигительное пятничное чтиво, серьёзно. Спасибо. :)
Спасибо, сам испытываю наслаждение от статей Mike Ash)
На самом деле этот мужик просто космический! Он, по-моему, единственный на земном шаре понимает как компьютеры работают на всех уровнях: от микросхем до высокоуровневых API.
Sign up to leave a comment.

Articles