Hlavní navigace

Co nového v objektivním světě

19. 3. 2012 15:01 zboj

Pokud vám to při čtení nadpisu nedošlo, tento článek pojednává o Objective-C, konkrétně o jeho nejnovější verzi, jak ji implementují nové LLVM a clang. ObjC se v posledních letech rychle vyvíjí z okrajové záležitosti v moderní jazyk a jako zatím poslední vylepšení nám vývojáři nabídli například nové literály pro práci se základními datovými strukturami.

Nové literály

Začněme trivialitami. ObjC má nové literály pro pole, asociativní pole a čísla reprezentovaná jako instance třídy NSNumber. Je to jen syntaktický cukr, nicméně už dlouho jsme čekali, abychom mohli místo

[NSNumber numberWithInteger: 1234]

psát

@1234

Trošku přehlednější, že? Stejně tak místo [NSArray arrayWithObjects: obj1, obj2, obj3, nil] teď použijeme @[obj1, obj2, obj3]. Podobný zápis mají asociativní pole: @{…}.

Navíc můžeme k prvkům pole přistupovat indexací pomocí hranatých závorek, tedy jako v každém jiném slušném programovacím jazyce, až už jde o Javascript, C++ nebo C#.

Lambda výrazy a bloky

Kdo používá C++, konečně se dočkal lambda výrazů podle nového standardu (C++11). Clang tak teď má dvojí syntax pro literály vyjadřující kus kódu. Toto rozšíření se netýká pouze ObjC, clang ale nyní umí také automaticky převést lambda výraz (např. [](){ return 1234; }) na clangovský blok, v tomto případě typu NSInteger(^)(). Sice vás nemusí zajímat, jak to funguje uvnitř, ale je poučné podívat se, jak toho překladač dosahuje. Celé to je až primitivní: lambda výraz se „zabalí“ do bloku, ten se ve většině případů zkopíruje ze zásobníku na haldu a tam se předá automatické správě paměti. Z uvedeného vyplývá, že tato automatická konverze vyžaduje přítomnost ObjC runtimu (kvůli ARC) a v čistém C++ proto nefunguje (byť jak lambda výrazy, tak bloky v něm k dispozici jsou). Kopírování na haldu se neprovádí vždy, pokud překladač usoudí, že to není potřeba, zůstane blok na zásobníku.

Sdílet