Irbis: že prý žádné novinky? - MujMAC.cz - Apple, Mac OS X, Apple iPod

Odběr fotomagazínu

Fotografický magazín "iZIN IDIF" každý týden ve Vašem e-mailu.
Co nového ve světě fotografie!

 

Zadejte Vaši e-mailovou adresu:

Kamarád fotí rád?

Přihlas ho k odběru fotomagazínu!

 

Zadejte e-mailovou adresu kamaráda:

Soutěž

Sponzorem soutěže je:

IDIF

 

Kde se narodil známý fotograf František Drtikol?

V dnešní soutěži hrajeme o:

Seriály

Více seriálů



Software

Irbis: že prý žádné novinky?

29. září 2009, 00.00 | Více než po roce se opět vracíme se seriálem o programování v Kakau – je zde nová kočka s novými možnostmi, a na ty se v následující sérii článků podíváme blíže.

Pro uživatele byl Irbis inserován jako „verse, jež nebude obsahovat žádné novinky“ (ale jen opravy chyb). Potěšující je, že z hlediska programátora tomu tak není – alespoň tedy co se týká novinek: Irbis je novými a velmi zajímavými technologiemi i drobnými, ale cennými vylepšeními existujících API přímo nabit.

(Zbývá jen doufat, že nebude také nabit novými chybami; po zkušenostech s Le Prdem mám poněkud obavy, ale klepu na dřevo a doufám. Mimochodem, závažná chyba, již jsme si ukázali v minulém článku, je již opravena; méně závažná chybka varování nikoli, ale to v zásadě asi moc nevadí, neboť překladač GNU C v Mac OS X stejně pěje píseň labutí – k tomu se ale vrátíme až později.)

Podíváme se na novinky a rozšíření samotného jazyka Objective C, na nové technologie a jim odpovídající knihovny, ukážeme si novinky ve Foundation i v Application Kitu, a pak… uvidíme: bude-li zájem, můžeme opět spustit pravidelný seriál o programování; témat je k dispozici dost a dost :)

Bloky? Bloky. Bloky!

Hned dnes se podíváme, co je nového v samotném jazyce. Moc toho není; v podstatě jde o jedinou změnu – ale o změnu velmi podstatnou a důležitou; osobně bych si dovolil ji označit za vůbec nejvýznamnější doplněk jazyka od doby, kdy Brad Cox implementoval objc_send: při programování v Mac OS X totiž nyní můžeme používat bloky.

Co je to blok

V kontextu klasických strukturovaných programovacích jazyků se občas pojem blok používal pro složený příkaz, který mohl obsahovat deklarace vlastních proměnných – třeba nějak takto:

void fnc(NSUInteger n) {
  for (NSUInteger i=0;i<n;i++) {
    printf("Toto se provede %lu-krát.\n",n);
  }

}

„Opravdický blok“ – v angličtině se někdy pro odlišení užívá pojmu closure, který se nakolik je mi známo nedá nijak rozumně přeložit do češtiny, takže se budeme držet českého termínu „blok“ – je v podstatě totéž; jen se to může vzít jako samostatný celek a z postavení ve funkci „vyndat“ a použít jindy a jinde. Udělat ze složeného příkazu skutečný blok, je triviální – prostě před jeho otevírací složenou závorku přidáme znak ‚^‘. Blok můžeme třeba uložit do proměnné  – blokové proměnné se deklarují přesně stejně, jako ukazatele na funkce, jen namísto ‚*‘ mají ‚^‘ – a jejím prostřednictvím zavolat, nějak takto:

  ...
  void (^block)()=^{ // teď již je to opravdický blok!
    printf("Toto se provede %d-krát.\n“,n);
  }
  for (i=a;i<b;i++) block();
  ...

Výše uvedený příklad ovšem nepřinesl nic zajímavého – jen ilustroval princip, na němž bloky fungují. Opravdu zajímavé to začne být ve chvíli, kdy bloky použijeme jako argumenty funkcí (či zpráv Objective C, ale to si ukážeme až za chvilku). Volající pak nebude samozřejmě ukládat blok do proměnné, ale přímo jej zapíše na místo argumentu volané funkce – nějak takto:

  ...
  atexit_b(^{
    printf("Program je ukončen, uklízíme...\n");
    ...
  });
  ...

V tomto případě se zadaný blok – ať už je jeho obsahem cokoli – automaticky provede bezprostředně před ukončením programu.

Bloky a proměnné

Bloky mohou mít – přesně stejně jako funkce – argumenty (a také návratovou hodnotu). Blok, použitý v cyklu, by tak nejspíše měl jeden argument, jímž by byla hodnota řídící proměnné, nějak takto:

void fnc(NSUInteger count) {
  void (^block)(NSUInteger)=^(NSUInteger n){
    printf("%lu-tý průchod cyklem\n",n);
  };
  for (NSUInteger i=0;i<count;i++) block(i);
}

Ještě zajímavější je to, že bloky mají přístup ke všem proměnným, jež jsou dostupné ve chvíli jejich deklarace, a „zafixují“ si jejich hodnoty. Podívejme se na jednoduchoučkou modifikaci minulé ukázky, kdy blok nevytvoříme uvnitř funkce, ale předáme jí jej jako argument:

void fnc(NSUInteger count,void(^block)(NSUInteger)) {
  for (NSUInteger i=0;i<count;i++) block(i);
}

a na následující příklad programu, který jí využije pro několikanásobný opis každého druhého ze svých vstupních argumentů (přičemž prvé argumenty určují počet opakování):

int main(int argc,char *argv[]) {
  for (int an=1;an<argc;an+=2)
    fnc(atoi(argv[an]),^(int n){printf("%d: %s\n",n+1,argv[an+1]);});
  return 0;
}

~> cc -std=gnu99 q.m && ./a.out 2 dva 3 tri
1: dva
2: dva
1: tri
2: tri
3: tri
~> 

Princip funkce je zřejmý – v cyklu procházíme vstupní argumenty; každý prvý z nich použijeme (po převodu na číslo pomocí standardní knihovní funkce atoi) jako počet opakování bloku. Uvnitř bloku pak vypíšeme pořadové číslo – jež blok dostane jako vstupní argument – a následující argument příkazového řádku.

A zde je vhodné se na chvilku zarazit: funguje to logicky tak, jak bychom čekali, vypisují se ty správné argumenty... ale jak se k nim blok, volaný z funkce fnc, dostane, když v ní nikde nejsou k dispozici ani seznam argumentů argv, ani pomocná proměnná an cyklu z funkce main?

To je právě ona schopnost bloků, o níž hovoříme: ve chvíli, kdy je blok definován, si zafixuje hodnoty všech proměnných, jež jsou v něm použity. Jinde, kde je volán (a kde tyto proměnné obecně nejsou přístupné), je pak blok může bez problémů použít. Jinde – nebo klidně i jindy! Prostudujte si následující příklad, a uvědomte si, co z něj pro široké možnosti práce s bloky vyplývá:

int main(int argc,char *argv[]) {
  for (int an=1;an<argc;an+=2) {
    int count=atoi(argv[an]);
    if (count) fnc(count,^(int n){printf("%d: %s\n",n+1,argv[an+1]);});
    else atexit_b(^{printf("argument #%d (%s) \n",an,argv[an+1]);});
  }
  printf("Konec funkce main.\n"); // nyní již proměnná 'an' neexistuje
  return 0;
} // a nyní již neexistují ani argumenty 'argc' a 'argv'
~> cc -std=gnu99 q.m && ./a.out 0 konec 1 cosi
1: cosi
Konec funkce main.
argument #1 (konec) 
~> 

Podpora bloků v Mac OS X

Jednu ze služeb, jež využívá bloků, jsme si již ukázali – jde o novou standardní službu atexit_b, jež blok uloží a provede jej těsně před ukončením programu. API Irbisu podobných služeb nabízí mnoho, řadu na úrovni plain C, a další v objektových knihovnách Cocoa. Bezmála kdekoli, kde dává smysl „provést nějaký kus kódu jinde, jindy nebo jinak než právě teď“, můžeme pro daný účel velmi pohodlně využít právě bloků.

Snad nejvýraznějším příkladem je malý zázrak jménem Grand Central Dispatch – technologie, jež nejenže umožňuje psát efektivní paralelní kód o mnoho řádů snáze, než kdybychom implementovali vlákna pomocí služeb vhodné knihovny (např. NSThread v Cocoa); navíc jsou takto napsané programy daleko efektivnější. My se na ni podíváme později v samostatném článku podrobněji; vyplatí se ale ukázat si hned to, jak využívá bloků.

Nejjednodušším příkladem může být tento kód, který simuluje čtveřici časově náročných operací:

int main(int argc,char *argv[]) {
  for (NSUInteger i=0;i<4;i++) {
    printf("operace %lu...\n",i+1);
    sleep(2);
    printf("... operace %lu hotova\n",i+1);
  }
  return 0;
}
~> cc -std=gnu99 q.m && time ./a.out
operace 1...
... operace 1 hotova
operace 2...
... operace 2 hotova
operace 3...
... operace 3 hotova
operace 4...
... operace 4 hotova
./a.out  0.00s user 0.00s system 0% cpu 8.010 total
~> 

Ten, kdo má nějaké zkušenosti s programováním s vlákny, ví, že převést tento triviální kód na paralelní běh by nebylo příliš těžké, ale rozhodně by bylo zapotřebí počet programových řádků minimálně zdvojnásobit. Díky blokům (a technologii Grand Central Dispatch) však stačí jen nahradit složený příkaz v těle cyklu blokem (tj. vlastně jen přidat ‚^‘ a řídící proměnnou), a nahradit příkaz for voláním vhodné funkce GCD:

int main(int argc,char *argv[]) {
  dispatch_apply(4,dispatch_get_global_queue(0,0),^(size_t i){
    printf("operace %lu...\n",i+1);
    sleep(2);
    printf("... operace %lu hotova\n",i+1);
  });
  return 0;
}
~> cc -std=gnu99 q.m && time ./a.out
operace 1...
operace 2...
... operace 1 hotova
operace 3...
... operace 2 hotova
operace 4...
... operace 3 hotova
... operace 4 hotova
./a.out  0.00s user 0.00s system 0% cpu 4.004 total
~> 

(Mimochodem, proč se neprovedly všechny čtyři operace naráz, ale běžely po dvojicích? Proto, že techologie GCD dobře ví, že na počítači jsou právě dvě jádra, a nemá tedy smysl spouštět více než dvě vlákna /jež neužívají semaforů/ najednou.)

Ukažme si na závěr jen jednu z mnoha – opravdu z mnoha! – možností využití bloků v Objective C. Dejme tomu, že máme třeba pole objektů, representujících běžící aplikace, a že je chceme setřídit nějakým velmi absurdním způsobem, jenž by bylo obtížné nebo nemožné formulovat standardním způsobem s využitím objektů NSSortDescriptor – třeba chceme třídit podle třetího písmene názvu. Tradičně bychom samozřejmě mohli použít službu sortedArrayUsingFunction:; to ovšem znamená definovat statickou funkci na jiném místě, než kde třídíme – a to je nešikovné, nepohodlné a přináší to risiko chyb při údržbě a změnách kódu.

S bloky není nic snazšího; vypadalo by to – včetně ochrany pro případ, že některý z názvů není dostatečně dlouhý – asi nějak takto:

NSArray *sorted=[[[NSWorkspace sharedWorkspace] runningApplications] sortedArrayUsingComparator:
  ^NSComparisonResult(id a,id b){
    if ([a=[a localizedName] length]<3 || [b=[b localizedName] length]<3) return NSOrderedSame;
    return [a characterAtIndex:2]-[b characterAtIndex:2];
  }];

Za povšimnutí stojí kompletní deklarace bloku včetně typu jeho návratové hodnoty („^NSComparisonResult(id a,id b)“) – v takovýchto případech to je zapotřebí, neboť překladač nemůže s jistotou návratovou hodnotu odhadnout z kódu, a výsledkem může být chyba.

Obsah seriálu (více o seriálu):

Tématické zařazení:

 » Rubriky  » Informace  

 » Rubriky  » Agregator  

 » Rubriky  » Software  

Diskuse k článku

 

Vložit nový příspěvek   Sbalit příspěvky

 

Tak máme konečně bloky i v ObjC

Autor: PH Muž

Založeno: 29.09.2009, 00:39
Odpovědí: 0

...C# je má už dávno...

Odpovědět na příspěvek

RE: Tak máme konečně bloky i v ObjC

Autor: Michal3 Muž

Založeno: 29.09.2009, 08:13

No to teda nema, C# ma jen obycejne lambdy ale ne closures. Nauc se rozeznat rozdil a pak pis :-)

Odpovědět na příspěvek

RE: RE: Tak máme konečně bloky i v ObjC

Autor: PH Muž

Založeno: 29.09.2009, 09:58

Tak teď vypadáš jako debil. V C# fungují closures stejně jako třeba v Javascriptu, narozdíl od Javy (nebo ObjC před tou nejnovější verzí). Můžeš si to sám zkusit, v .NET 3.5 to šlape, ale myslím, že to C# má nejméně od verze 3.0.

Odpovědět na příspěvek

RE: RE: RE: Tak máme konečně bloky i v ObjC

Autor: OC Muž

Založeno: 29.09.2009, 12:58

No, hlavně to, jak dlouho mají bloky jiné jazyky, je pro ObjC poměrně dost irelevantní :)

A C# nelze pro programování v Cocoa použít z principu, protože není objektové -- tj. nemá zprávy a neumožňuje plné využití zástupných objektů, podobně jako kupříkladu Java. To by lepším příkladem bylo třeba Ruby, jež má ostatně bloky "odjakživa".
___
Pozor
: informace o C# mám z doslechu, sám v tom neprogramuji. Mohu se tedy mýlit, ačkoli je to poměrně nepravděpodobné, neboť jsem si je ověřoval více dotazy na více programátorů.

Odpovědět na příspěvek

RE: RE: RE: RE: Tak máme konečně bloky i v ObjC

Autor: Cyberdog Muž

Založeno: 29.09.2009, 13:51

No sice máte poměrně "svérázné" názory, na to už si čtenáři zvykli, ale to, že C# a Java nejsou objektové jazyky, to jste asi přehnal, ne ? Jde mi o praktický dopad, ne o nějaké teoretizování, že se tomu jednou říká zpráva a podruhé metoda nebo funkce. C# taky neznám, ale minimálně pro Javu API pro Cocoa existuje (že ho Apple odložil, a důvody které ho k tomu vedly, ponechme stranou), takže myslím, že z principu nemáte pravdu.

Odpovědět na příspěvek

RE: RE: RE: RE: RE: Tak máme konečně bloky i v ObjC

Autor: OC Muž

Založeno: 29.09.2009, 14:02

Zcela prakticky, všechny teoretické řeči o "polymorfismu", "zprávách", "metodách" apod. ponechme stranou: lze v C# vytvořit a používat plnohodnotný zástupný objekt (proxy), nebo ne?

Pokud vím, tak ne. (Vím jistě, že to není možné v Javě.)

Pokud to vím správně a nebyl jsem v tomto směru misinformován, pak C# prostě není objektový jazyk (stejně jako jím není Java nebo C++). To praví pan Alan Curtis Kay (a já s ním plně souhlasím; můj názor ovšem není podstatný, kdežto jeho ano, a to tak, že velmi).

Nicméně, terminologie také není podstatná -- chcete-li, klidně předefinujte pojem "objektový jazyk" jinak, než jak jej specifikoval pan Kay, takže se do něj Java (a třeba i C++) vejdou -- na té podstatné věci to nic nezmění, a tou podstatnou věcí je, že takové jazyky nejsou dost dobře použitelné pro Cocoa.
___
Důvody, jež Apple k tomu, že přestal podporovat Java bridge, důležité jsou -- je to totiž právě toto: Java není plnohodnotný objektový jazyk (podle Kaye, pro Vás dejme tomu "plnohodnotný kakaový jazyk"), a proto v ní prostě řada velmi podstatných věcí, jež jsou v Cocoa běžné, a jež jsou šmahem založeny na zástupných objektech, nešlo, nejde, a nepůjde. Jediné, co bylo možné, bylo jaksi "zvenku" volat služby, naprogramované v ObjC (nebo v Ruby nebo v jiném plně objektovém /pro Vás "kakaovém"/ jazyce), a to nestačí.

Odpovědět na příspěvek

RE: RE: RE: RE: RE: RE: Tak máme konečně bloky i v ObjC

Autor: Cyberdog Muž

Založeno: 30.09.2009, 09:27

Řekl bych, že to nebyla moc "praktická" odpověď : napřed píšete, že teoretizování vynecháme, a hned o větu dál opakujete, že C# a Java nejsou objektové jazyky, protože nemají "plnohodnotné proxy objekty". To, že si to myslí taky A. Kay (byť jeho zásluhy ve vývoji objektových jazyků jsou zásadní) je vcelku irelevantní, beru to jednak jako názor "zaujaté" strany (napsal přece "konkurenci", tj. Smalltalk a Squeak, takže to muže být jen házení špíny, protože Squeak skoro nikoho nezajíma...). Důležité je, jak je to vnímáno (drtivou) většinou lidí, kteých se to týká (programátorů...) a troufnu si tvrdit, že zde panuje většinová shoda, co to objektový jazyk je (to máte stejné jako s archaizmy jako "verse"..to co je správné definuje většinové použití, ať se vám to líbí nebo ne..jestli bude angličtina dále pronikat do češtiny, je klidně možné že za pár let bude jediný správný tvar version nebo dejmetomu třeba veržn - a bude to tak správně, pokud se to prosadí).
Ale zpátky k tomu objektovému jazyku...a co tedy podle vás jsou objekty v Javě a C#, když to nejsou objektové jazyky ?
Vraťme se k tomu praktickému použití : právě existence JavaBridge pro Cocoa (tedy tehdy ještě "Yellow Box") dokazuje že to (když vás mám parafrázovat) šlo a jde. Ale nejspíš to dále nepůjde, nikoliv z technických, ale politických důvodů. Java byla pro Apple v začátcích důležitá, chtěl tak přitáhnout vývojáře, proto se technické řešení - pochopitelně - našlo, právě existence JavaBridge je toho důkazem. Časem si to Apple rozmyslel, a podporu ukončil, ale byly to strategické, ne technické důvody. Mimochodem, funkcionalitu message frowarding a ty slavné proxy objekty lze v Javě realizovat taky, pomocí reflexion a anotací. Není to tak elegantní, ale funkčně ekvivalentní. Navíc - kdyby byl opravdu zájem - nevidím důvod, proč by to nemohlo být do jazyka přidáno "nativně". Ale mě osobně to nechybí a na "objektovosti" Javy to nic nemění.

Odpovědět na příspěvek

RE: RE: RE: RE: RE: RE: RE: Tak máme konečně bloky i v ObjC

Autor: OC Muž

Založeno: 30.09.2009, 13:05

Zkuste si, prosím, najít ve slovníku smysl pojmu "praktický" :)

Zástupné objekty nejsou nějakým teoretickým ukazatelem, nýbrž základem naprosté většiny běžně užívaných objektových mechanismů. Bez nich to moc nejde (resp. jde-li, pak velmi, velmi blbě). A nějaký plebiscit ("zde panuje většinová shoda") na tom nic nezmění.

Pokud tomu nerozumíte (to dedukuji z Vašeho "mě "(sic) "osobně to nechybí", neboť je to asi tak zhruba totéž, jako kdybyste tvrdil, že Vám v automobilu nechybí motor, protože s kopce jezdí skvěle), kupte si mou knihu o objektovém programování, vyšla nedávno v Gradě. Dobře polovina je věnována různým využitím zástupných objektů -- nikoli náhodou.
___
Ani reflexion, ani anotace plnohodnotný zástupný objekt implementovat v samotné Javě (bez "native" triků) neumožní. Zkuste to někdy. Programátoři Apple to zkoušeli asi deset let. Marně.

Odpovědět na příspěvek

RE: RE: RE: RE: RE: RE: RE: RE: Tak máme konečně bloky i v ObjC

Autor: PH Muž

Založeno: 30.09.2009, 13:34

Tu knihu doporučuju ;-) Možná mohla být trochu obsáhlejší, na druhou stranu existuje dost anglickojazyčné literatury k tématu, takže jako úvod do OOP pro trotly, co neumí anglicky, to stačí :-)

Odpovědět na příspěvek

RE: RE: RE: RE: RE: RE: RE: RE: RE: Tak máme konečně bloky i v ObjC

Autor: OC Muž

Založeno: 30.09.2009, 14:39

Za doporučení děkuji :)

Stran rozsahu, já bych napsal s chutí podrobnější, ale kdybyste tušil, jaký problém byl prosadit v Gradě i jen toto!

Zrovna v současnosti jednám o případné možnosti napsat rozsáhlejší publikaci buď o Cocoa pro pokročilé, nebo o programování iPhone, s Computer Press; moc nadějně to ale nevypadá, protože nabízejí podmínky, za nichž by se jednalo o ryze charitativní činnost -- a na to přec jen tak úplně nemám pokdy, abych dělal za pár desítek Kč na hodinu :(

Odpovědět na příspěvek

RE: RE: RE: RE: RE: RE: RE: RE: RE: RE: Tak máme konečně bloky i v ObjC

Autor: PH Muž

Založeno: 30.09.2009, 17:55

No jo, já to tušil, že to bude vydavatelstvím. A k té "charitě" - v ČR lidi vůbec nejsou moc zvyklí na to, že za kvalitu (a práci vůbec) se platí. Já už podnikám jen v zahraničí.

Odpovědět na příspěvek

RE: RE: RE: RE: RE: RE: RE: RE: Tak máme konečně bloky i v ObjC

Autor: Cyberdog Muž

Založeno: 30.09.2009, 15:31

Musím položit stejnou otázku, která tady v diskuzi už jenou zazněla : proč je ve vaší odpovědi tolik agresivity ?
Díky za self-promotion, ale co je proxy objekt opravdu vím, takže se myslím bez vaší knížky obejdu. S tou \\\\\\\"naprostou vetšinou běžně používaných objektových mechanizmů\\\\\\\" bych byl opatrný...chcete tvrdit, že všichni, ti, kteří nepoužívají Obj-C nebo Smalltalk jsou tupci, kteří si naschvál přidělávají práci ?

BTW : Na argument, že Java Cocoa API je důkazem, že to bez proxy objektů jde, jste mi jaksi neodpověděl.

Odpovědět na příspěvek

RE: RE: RE: RE: RE: RE: RE: RE: Tak máme konečně bloky i v ObjC

Autor: Algi Muž

Založeno: 02.10.2009, 08:18

Na druhou stranu se nedá Applu upřít snaha o vylepšování Javy. Poslední rok/dva se mi zdá, že opravdu zabrali. Už jenom ta spousta Developer Preview a teď po vydání Snow Leoparda jsem očekával, že to skončí. Nikoliv. Vydali nový DP s dalšíma skvělýma věcma. Můj osobní názor je takový, že nejlepší implementace Javy pro desktop je právě na Mac OS X. Takovou míru integrace jsem totiž jinde neviděl...

A pokud bych chtěl používat Cocoa, tak JNI to jistí. Ve spojení s Universal Binary to je velmi mocná zbraň. Občas mi v Javě některé vlastnosti Obj-C chybí, ale vždy se to dá nějakým způsobem vyřešit...

Odpovědět na příspěvek

RE: RE: RE: RE: RE: RE: RE: RE: RE: Tak máme konečně bloky i v ObjC

Autor: Cyberdog Muž

Založeno: 02.10.2009, 10:03

No asi je to vec nazoru. Urcite je dobry, ze se na to nevybodli uplne, ale idealni stav to urcite neni. At si OC rika co chce, Java je hodne dulezita technologie (i pro Apple, diky ni proda hodne pocitacu, mraky vyvojaru pouzivaji MBP), nekdy je zaostavani za novymi verzemi pro ostatni systemy docela neprijemne.
Duvod, proc zrusili Cocoa Java API dodnes moc nechapu...

Odpovědět na příspěvek

RE: RE: RE: RE: RE: RE: RE: RE: RE: RE: Tak máme konečně bloky i v ObjC

Autor: OC Muž

Založeno: 02.10.2009, 13:10

Tak ještě jeden, poslední pokus...

Váženosti, pletete různé věci dohromady.

(a) lze v libovolném neobjektovém jazyce slušně programovat? Samozřejmě ano, leč s tímto seriálem to nesouvisí.

(b) lze v libovolném neobjektovém jazyce slušně programovat _v Cocoa_?

Zde je odpověď "nikoli, a to ani v případě, že je k dispozici bridge na podobné úrovni, jako byl Javabridge".

Důkazem je kupříkladu to, kolik aplikací v Cocoa/Java bylo na trhu... a to je právě obchodní důvod, proč Apple ten bridge nepodporuje: pro těch pár zcela zanedbatelných aplikací se to nevyplatí.

Ten technický důvod (jenž je zároveň důvodem toho, proč těch aplikací bylo tak málo), jsem Vám vysvětloval už dávno.

To, že existují javští programátoři, již pro různé výhody používají Mac OS X, je opět irelevantní, neboť nikdo z nich (až na množinu míry nula, již lze zanedbat bez újmy na obecnosti) nepíše v CocoaJava (a nepsali v něm ani v době, kdy byl bridge podporován).

To je celé; skutečně je to tak jednoduché.

Odpovědět na příspěvek

RE: RE: RE: RE: Tak máme konečně bloky i v ObjC

Autor: PH Muž

Založeno: 29.09.2009, 13:56

No je to relevantní pro srovnání, navíc C# je docela hezký jazyk. I když jsem zatím bloky (closures) kromě Javascriptu nikdy nikde nepoužil. A jinak píšu dost pro iPhone, a tam bloky stejně nejsou :-(

Odpovědět na příspěvek

RE: RE: RE: RE: RE: Tak máme konečně bloky i v ObjC

Autor: OC Muž

Založeno: 29.09.2009, 14:05

Ono v iPhone toho není víc :( Bloky tam podle mého názoru časem budou; horší to je s některými API... ale to už sem vůbec nepatří :)

Odpovědět na příspěvek

Ach jo

Autor: Vojtin Muž

Založeno: 29.09.2009, 01:23
Odpovědí: 0

Zkouseli jste si tento clanek otevrit v Iphone? Lamy

Odpovědět na příspěvek

Nové pojmy ?

Autor: Krtek Muž

Založeno: 29.09.2009, 04:55
Odpovědí: 0

Nemam rád když někdo lamentuje nad češtinou v článcích ale "inserován" a "verse" mně opravdu praštilo do očí. Odhadoval bych že to "verse" pochází z nepoužívání češtiny v systému obecně.

Odpovědět na příspěvek

RE: Nové pojmy ?

Autor: OC Muž

Založeno: 29.09.2009, 05:20

Až -- nebo pokud vůbec! -- se naučíte česky, zjistíte, že to je správně. Stejně jako kupříkladu skan_s_en či všeliké -i_s_my.

Ale patrně ztrácím čas házením hrachu na zeď totální ignorance, jako ostatně obvykle :(

Odpovědět na příspěvek

RE: RE: Nové pojmy ?

Autor: Dan Muž

Založeno: 29.09.2009, 08:48

Proc tolik agresivity...? Hulanovsky syndrom...?

Jinak closures jsou v cestine "uzavery", tak laskave odstrante tu vetu o tom, ze tento termin nema v cestine ekvivalent...

Odpovědět na příspěvek

RE: RE: RE: Nové pojmy ?

Autor: OC Muž

Založeno: 29.09.2009, 12:53

> Proc tolik agresivity...?

Únava a dlouhodobá frustrace nad tím, kterak je naprosto běžné (žel i na tomto serveru) češtinu prasit, prasit a prasit.

Odstraňovat nic nemohu ani kdybych chtěl, to mi RS neumožňuje. S pojmem "uzávěr" jsem se dosud v tomto smyslu nesetkal, nicméně překlad to není špatný, děkuji za opravu, a budu si to pamatovat!

(Ale stejně se přidržím "bloků" i česky, stejně jako se v angličtině držím termínu "blocks" a "closures" neužívám :))

Odpovědět na příspěvek

RE: RE: RE: RE: Nové pojmy ?

Autor: PH Muž

Založeno: 29.09.2009, 13:52

"Uzávěr" je překlad pojmu "closure" v matematice. Myslím, že v souvislosti s Javascriptem se užívá občas taky. Ovšem ObjC vychází ze Smalltalku, takže se držme "bloků" :-)

Odpovědět na příspěvek

RE: RE: RE: RE: Nové pojmy ?

Autor: Krtek Muž

Založeno: 29.09.2009, 15:31

No prasit češtinu.. ano často tu lidi do autorů za to šijou. Sám se tomu snažim vyhýbat. Uznávam že pojem inserát existuje ale stačí zagooglit a zjistítě že se dneska skoro nepoužívá. Proto bych spíš použil inzerát a obdobně verze což je spíš pojem pro anglomilce.

Odpovědět na příspěvek

RE: RE: RE: RE: RE: Nové pojmy ?

Autor: OC Muž

Založeno: 29.09.2009, 15:52

Inu, to, že se něco "skoro nepoužívá", ještě není důvod se tomu vyhýbat, zvláště pak mám-li důvody to považovat za lepší variantu... ostatně, Macy se, ve srovnání s Wintely, také skoro nepoužívají :)

Z mnoha důvodů, jež na tomto místě asi nemá smysl rozebírat, preferuji starší varianty kdekoli, kde je dubleta možná -- a velmi důrazně na nich trvám tam, kde nová Pravidla připouštějí tvar, který je z hlediska jazykového vývoje zcela jednoznačně chybný, jenže si jej jaksi vynutilo množství jeho uživatelů (typicky např. "diskuze" či "skanzen").

Za to, jak jsem na Vás včera vyjel, se velice omlouvám; měl jsem toho všeho skutečně až nad hlavu, mj. proto, že jsem zrovna v té chvíli četl jakýsi text, plný "diskuzí" (jež jsou již, stokráte bohužel, povoleny), "oni ví" a "by jste" (jež jsou zatím považovány za chybu, leč obávám se, že dlouhého trvání to mít nebude), "Apple počítačů" a "Cisco routerů" (o nichž řada lidí ani netuší že a proč jsou špatně), a podobných a horších ohavností....

Odpovědět na příspěvek

RE: RE: RE: RE: RE: RE: Nové pojmy ?

Autor: Krtek Muž

Založeno: 29.09.2009, 19:44

To je vpohodě. Já si měl taky ověřit že ta slova existují v obou tvarech.

Odpovědět na příspěvek

RE: RE: Nové pojmy ?

Autor: PH Muž

Založeno: 29.09.2009, 10:04

Měl bych jeden dotaz. Když deklaruju pomocí __block instanci nějakého objektu, tak tento není automaticky "retained". Jaký je nejlepší způsob vyhnutí se "memory leakům". Nenapadá mě žádný obecný způsob, jak se při rušení bloku dostat na proměnné, které je třeba uvolnit.

Odpovědět na příspěvek

RE: RE: RE: Nové pojmy ?

Autor: OC Muž

Založeno: 29.09.2009, 12:50

Bude to někde v příštích dílech podrobněji: blok si proměnné, jež používá, retainuje (a uvolní) sám. Vy se musíte postarat jen o retain/release bloku jako celku (blok je z hlediska ObjC objekt).

POZOR, je tam jeden podraz (ten by měl být i s příkladem hned příště): obvykle nestačí retain, je potřeba copy, protože blok (na rozdíl od ostatních objektů) může být transientní na zásobníku!

Odpovědět na příspěvek

RE: RE: RE: RE: Nové pojmy ?

Autor: OC Muž

Založeno: 29.09.2009, 13:22

Tak jsem ještě rychle nahlédl do rozvrhu článků, a příklad na to "copy" bude přespříště ("cocoa_107"). Ale i bez příkladu je to snad jasné -- pokud si ukládáte blok (který může být zadán inline), je vždy třeba vytvořit jeho kopii: retain někdy stačí, ale ne vždy.

Pozn.: ObjC o tom, zda vytvoří blok na zásobníku nebo ne, rozhoduje podle poměrně _dost_ složitých pravidel (pokud vím, nejsou nikde popsaná, alespoň jsem je nenašel). Speciálně tedy to, že to někdy s retain zrovna náhodou funguje, _není_ zárukou, že to s ním bude fungovat vždy!

Odpovědět na příspěvek

RE: RE: RE: RE: Nové pojmy ?

Autor: PH Muž

Založeno: 29.09.2009, 13:53

Aha, tak to je chyba v článku (anglickém), který jsem o blocích četl. V tom případě je všechno fajn.

Odpovědět na příspěvek

Příklad použití

Autor: PH Muž

Založeno: 29.09.2009, 10:08
Odpovědí: 0

http://code.google.com/p/
entropydb/wiki/UsingBlock
s

Odpovědět na příspěvek

RE: Příklad použití

Autor: OC Muž

Založeno: 29.09.2009, 13:02

Ano, ačkoli (a) myslím, že je praktičtější ukazovat příklady na třídách Cocoa (a EXContainer takovou třídou není), (b) -- to s bloky samotnými nesouvisí -- v ObjC 2 by bylo čistší a korektnější "age" definovat jako property. Jinak řada dalších příkladů a ukázek bude samozřejmě v dalších pokračováních.

Odpovědět na příspěvek

RE: RE: Příklad použití

Autor: PH Muž

Založeno: 29.09.2009, 13:50

Jistě, EXContainer nepatří do Cocoa, ale je to třída nadmíru užitečná ;-)

Odpovědět na příspěvek

drobná chybka

Autor: OC Muž

Založeno: 29.09.2009, 13:13
Odpovědí: 0

A propos, jak to teď po sobě čtu, pozor -- když jsem ukázky zkracoval, aby se dobře vešly do okna (vím, že to na iPhone nefunguje úplně dobře, ale s tím nic nenadělám, to je věc designu stránek a ten už neovlivním), vypustil jsem u proměnných typu NS(U)Integer některá přetypování, jež mohou být důležitá v případě, že kód se bude překládat pro 32- i 64bitové procesory.

Podrobnosti zde: http://www.mujmac.cz/art/
sw/Cocoa_103.html

Odpovědět na příspěvek

Poďakovanie pánovi Čadovi

Autor: Gazda Muž

Založeno: 29.09.2009, 21:00
Odpovědí: 0

Pán Čada, chcem sa poďakovať po Vašej dlhšej prestávke hlavne za Vaše dve knihy vydané tohto roku. Až z nich som pochopil OOP. Logicky a elegantne napísané.

Odpovědět na příspěvek

RE: Poďakovanie pánovi Čadovi

Autor: OC Muž

Založeno: 30.09.2009, 00:02

Já děkuji Vám -- potěšilo, moc!

Odpovědět na příspěvek

Fixovani hodnot??

Autor: jirkav Muž

Založeno: 23.10.2009, 14:46
Odpovědí: 0

Bloky (nebo taky anonymní funkce) nemohou přeci "fixovat hodnoty". Jak by to asi dělaly? Jediné co mohou, je zařídit, aby se proměnná nevytvořila na stacku, ale na heapu, a tak byla dostupná i později. Nevěříte-li, zkuste následující příklad. Pokud i potom budete trvat na tom, že bloky fixují hodnoty, vysvětlete, proč se při druhém volání f(x) vytiskne "x=1".

int main (int argc, const char * argv[]) {
int x = 0;
void (^f)(int) = ^(int a) { printf("x=%u\n", a); };
f(x);
x = 1;
f(x);
}

Odpovědět na příspěvek

RE: Fixovani hodnot??

Autor: PH Muž

Založeno: 23.10.2009, 14:54

Co to je za hovadinu? Nauč se nejdřív, jak fungují "closures" (uzávěry).

Odpovědět na příspěvek

RE: RE: Fixovani hodnot??

Autor: jirkav Muž

Založeno: 23.10.2009, 16:10

Vážený, doporučuji nejprve myslet, a teprve potom psát. Ne obráceně. A nejlépe psát slušně...

Odpovědět na příspěvek

RE: RE: RE: Fixovani hodnot??

Autor: PH Muž

Založeno: 23.10.2009, 16:42

No fajn, tak se zamysli (a pak třeba i napiš, pokud ti to ještě nedocvakne). V tom tvém pseudopříkladu nevypisuješ proměnnou x, vypisuješ argument funkce (bloku). V printf použij "x" místo "a" (ten argument tam je na nic) a místo f(x) volej f(). Pak bude printf v bloku vypisovat proměnnou deklarovanou vně bloku a její hodnota bude "zafixovaná". Ovšem pokud se ten blok má používat i jinde, je nutné tu proměnnou deklarovat pomocí __block__ (což se třeba v Javascriptu dělat nemusí, ale to je zase jiná záležitost).

P.S. Já bloky nepoužívám, tak je neznám do detailu, autor článku by to asi uměl vysvětlit lépe.

Odpovědět na příspěvek

RE: Fixovani hodnot??

Autor: OC Muž

Založeno: 24.10.2009, 01:23

> vysvětlete, proč se při druhém volání f(x) vytiskne "x=1"

Nejspíše asi proto, že je blok volán s touto hodnotou jako s argumentem?

Zkuste prosím třeba toto:

int main () {
int x = 0;
void (^f)(void) = ^{ printf("v bloku je x %d\n", x); };
printf("x je %d\n",x);
f();
x = 1;
printf("x je %d\n",x);
f();
}

Odpovědět na příspěvek

RE: RE: Fixovani hodnot??

Autor: jirkav Muž

Založeno: 26.10.2009, 13:21

Mnojo, máte pravdu, moje chyba. Blok opravdu použije nějakou kopii x. Aby to fungovalo tak, jak je "běžné", je potřeba deklarovat x s použitím __block:

int main (int argc, const char * argv[])
{
__block int x = 0;
void (^f)(void) = ^(void) { printf("x=%u\n", x); };
f();
x = 1;
f();
}

Odpovědět na příspěvek

 

 

Vložit nový příspěvek

Jméno:

Pohlaví:

,

E-mail:

Předmět:

Příspěvek:

 

Kontrola:

Do spodního pole opište z obrázku 5 znaků:

Kód pro ověření

 

 

 

 

 

Přihlášení k mému účtu

Uživatelské jméno:

Heslo: