Objective-C získalo v posledních letech díky rozšíření iOS na popularitě (viz Tiobe index). Pokud jste ObjC kdysi (před ObjC 2.0) viděli a stále soudíte podle tehdejšího dojmu, možná vás překvapí, že současná verze jazyka je podstatně jiná.
Nejprve se velice stručně podívejme na vývoj ObjC:
Dříve bylo nutné deklarovat instanční proměnné v @interface (z implementačních důvodů), teď už to je možné v @implementation, kam ostatně věci toho typu patří. Například:
@implementation { id something; }
@end
Jako prakticky všechny moderní jazyky (možná kromě Javy, ta má ale ekvivalentní anonymní třídy) má teď ObjC lambda výrazy:
[array sortUsingComparator: ^(id obj1, id obj2) { return [[obj1 name] compare: [obj2 name]]; }];
Nejnovější verze překladače zajišťuje automatickou správu paměti (i na iOS). S tím souvisí podpora slabých referencích (__weak) a změněná deklarace instančních proměnných:
@property (nonatomic, weak) id delegate;
Překladač nyní také přísněji kontroluje typy (pokud se nepoužije id), místo některých varování hází chybu. A fungují @private, @protected apod. (dříve jen varování ve stylu „This will not work in future versions“).
V neposlední řadě lze používat C++ a novou standardní knihovnu (libc++), která implementuje C++11 a je značně rychlejší (a navíc open source). Máte-li kód v C++, který chcete použít pod OS X nebo iOS, není nic snazšího než vytvořit si pro něj wrapper v ObjC (podobně jako to je možné v C++/CLI pod Windows). Pro C++ ARC pochopitelně nefunguje.
Sečteno a podtrženo, současná verze ObjC má vše, co ostatní moderní jazyky, kromě odlišné syntaxe není problém přejít z Javy nebo C#. Dny bez výjimek (ještě Apple ze začátku používal makra se setjmp a longjmp) jsou dávno pryč.
Java má tu výhodu, že je memory-safe, protože nemá pointery. C# je to stejné, jen má navíc explicitní "unsave" sekce.
Čisté C++, kde jsou jen reference a šablony a žádná pointerová aritmetika by mělo být taky skoro "safe". ObjC by na tom mělo být stejně, pointerová aritmetika tam je, ale typicky není potřeba.
ObjC je snad poslední relativně rozšířený jazyk, ve kterém jsem nedělal. Jsem zvědavý zda a kdy to přijde.
V C++ by se nemělo vůbec používat new (nanejvýš nepřímo přes make_shared), s move sémantikou v C++11 je lepší používat value typy. Pak je vše bezpečné.
ObjC je absolutně bezpečné, když se použije ARC (a nepoužije CoreFoundation nebo nějaký jiný kód v čistém C). Tedy bezpečné ve smyslu, že nikdy nedojde k ilegálnímu přístupu do paměti, úniky paměti lze vytvořit stejně. Nový runtime totiž nuluje slabé reference. Foundation a AppKit (knihovny) jsou bezpečné, např. u polí se kontrolují indexy apod. Tak trochu to funguje jako managed code+managed data nad CLR. Jakmile v ObjC použiju nízkoúrovňové C, je to jako unmanaged data v CLR a bezpečnost je fuč. (ARC je vymoženost posledních pár měsíců.)
Autor se zabývá vývojem kompilátorů a knihoven pro objektově-orientované programovací jazyky.
Přečteno 37 774×
Přečteno 26 420×
Přečteno 24 932×
Přečteno 21 278×
Přečteno 18 932×