{"id":6231,"date":"2011-03-14T17:40:09","date_gmt":"2011-03-14T16:40:09","guid":{"rendered":"http:\/\/www.devapp.it\/wordpress\/?p=6231"},"modified":"2011-03-14T17:40:09","modified_gmt":"2011-03-14T16:40:09","slug":"l015-programmazione-block-based%e2%80%9d-i-blocchi-in-objective-c","status":"publish","type":"post","link":"https:\/\/www.devapp.it\/wordpress\/l015-programmazione-block-based%e2%80%9d-i-blocchi-in-objective-c\/","title":{"rendered":"L#015 &#8211; Programmazione &#8220;block-based&#8221;: i blocchi in Objective-C"},"content":{"rendered":"<p><a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/03\/l015-objective-c-i-blocchi.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/03\/l015-objective-c-i-blocchi.jpg\" alt=\"l015-objective-c-i-blocchi\" title=\"l015-objective-c-i-blocchi\" width=\"200\" height=\"100\" class=\"alignleft size-full wp-image-6235\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/03\/l015-objective-c-i-blocchi.jpg 200w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/03\/l015-objective-c-i-blocchi-150x75.jpg 150w\" sizes=\"auto, (max-width: 200px) 100vw, 200px\" \/><\/a> Salve a tutti, in questo mio primo articolo vi propongo un argomento molto interessante: parleremo dei blocchi e della programmazione &#8220;block-based&#8221;. Vedremo a breve (pi\u00f9 avanti nell&#8217;articolo) a cosa serve e come pu\u00f2 essere sfruttata una programmazione di questo tipo, prima di tutto, per\u00f2, occorre rispondere ad una domanda: cos&#8217;\u00e8 un blocco?<br \/>\nUn blocco non \u00e8 nient&#8217;altro che una porzione di codice racchiusa tra parentesi graffe <strong>{codice}<\/strong> e preceduta dal simbolo <strong>^<\/strong> (caret).<!--more--> <\/p>\n<p>Queste porzioni di codice definiscono delle vere e proprie funzioni dichiarate &#8220;on the fly&#8221; ed eseguite poi in un certo momento durante il run loop. Nel <em>Foundation Kit<\/em> vi sono diversi metodi che utilizzano nella loro sintassi i blocchi. Prendiamone uno ad esempio dalla classe <em>NSDictionary<\/em>:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n- (void)enumerateKeysAndObjectsUsingBlock:(void (^)(id key, id obj, BOOL *stop))block\r\n<\/pre>\n<p>Questo metodo serve ad enumerare le chiavi e gli oggetti contenuti in un&#8217;istanza della classe <em>NSDictionary<\/em> applicando ad essi la funzione definita nel blocco (block) dichiarato dopo i due punti.<\/p>\n<p>Esaminiamo la sintassi della dichiarazione:<\/p>\n<ol>\n<li>il ( ^ ) ci dice che si tratta di un blocco;<\/li>\n<li>a precederlo \u00e8 la definizione del tipo di dato che la funzione definita nel blocco restituisce (in questo caso void ad indicare che non vi \u00e8 alcun dato restituito dalla funzione);<\/li>\n<li>a seguire, tra le parentesi,  vi sono gli argomenti forniti alla funzione (nel nostro caso la chiave e il corrispondente oggetto nel dizionario pi\u00f9 un puntatore ad una variabile di tipo BOOL (*stop) che, se settata a YES nella funzione, interromper\u00e0 l&#8217;iterazione).<\/li>\n<\/ol>\n<p>Nella definizione del blocco sia il tipo del dato restituito, che gli argomenti, sono opzionali, per cui se non ci sono argomenti si pu\u00f2 utilizzare la sintassi <strong>^{ }<\/strong>.<\/p>\n<p>Quindi se volessimo dichiarare e definire un blocco di nome &#8220;quadrato&#8221; che effettua il quadrato di un numero dovremmo scrivere:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\ndouble (^quadrato) (double numero) = ^(double numero) { return numero * numero};\r\n<\/pre>\n<p>Se vogliamo invece racchiudere un blocco in una variabile dobbiamo usare la funzione <em>typedef<\/em> e definire quella variabile in questo modo:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\ntypedef double (^operazione_t) (double numero);\r\n<\/pre>\n<p>e quindi:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\noperazione_t quadrato = ^(double numero) { return numero * numero};\r\n<\/pre>\n<p>Per comprendere ancora meglio:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\ntypedef void (^enumeratingBlock) (id key, id obj, BOOL *stop);\r\n<\/pre>\n<p>sarebbe la definizione di una variabile che pu\u00f2 contenere il blocco dichiarato nel metodo preso ad esempio.<\/p>\n<p>Ci sono altri due aspetti interessanti da considerare.<\/p>\n<p>Il primo \u00e8 che i blocchi possono essere considerati dei veri e propri oggetti con le stesse regole di gestione della memoria (un blocco \u00e8 rilasciato dopo la sua esecuzione oppure quando un oggetto che lo ritiene \u00e8 a sua volta deallocato). Possiamo ad esempio inserire i blocchi in un&#8217;array o in un dizionario (come ho fatto nel codice che vi allego).<\/p>\n<p>Il secondo \u00e8 che le variabili locali dichiarate prima del blocco possono essere usate all&#8217;interno del blocco, ma come variabili read-only:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\ndouble stopValue = 55.8;\r\n\r\n[aDictionary enumerateKeysAndObjectsUsingBlock:^(id key, id value, BOOL *stop) { \r\n\tNSLog(@\u201cvalue for key %@ is %@\u201d, key, value); \r\n\tif ([value doubleValue] == stopValue) {\r\n\t\t*stop = YES;\r\n\t}\r\n}];\r\n<\/pre>\n<p>a meno che non siano precedute da <strong>_block<\/strong> o non si tratti di una variabile di istanza, in questi casi rimangono variabili <em>read-write<\/em>.<\/p>\n<p>Le variabili dichiarate prima del blocco e da esso utilizzate sono automaticamente ritenute e rilasciate quando il blocco stesso \u00e8 rilasciato.<\/p>\n<h4>A cosa servono i blocchi?<\/h4>\n<p>Ma a cosa servono i blocchi? Non potreste mai immaginare a quante cose possono servire! Vi faccio un piccolo elenco:<\/p>\n<ul>\n<li>Enumerazione (come nel caso preso ad esempio)<\/li>\n<li>Animazione delle View<\/li>\n<li>Ordinamento (ordina questi oggetti utilizzando questo blocco come metodo di comparazione)<\/li>\n<li>Error handling (se si verifica questo errore esegui questo blocco)<\/li>\n<li>Notifiche (quando qualcosa succede esegui questo blocco)<\/li>\n<li>Completion handling (quando questa operazione \u00e8 terminata esegui questo blocco).<\/li>\n<\/ul>\n<p><a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/03\/UnaryCalculator.zip\" target=\"_blank\">Qui<\/a> trovate un programmino con il quale ho realizzato una calcolatrice che esegue solo tre operazioni. Ci\u00f2 che \u00e8 interessante \u00e8 che la definizione di queste operazioni \u00e8 fatta con blocchi inseriti in un dizionario di operazioni possibili, estendibile in modo semplice in qualsiasi momento.<\/p>\n<p>Nel prossimo articolo, vedremo con un esempio veloce quanto possa essere comodo utilizzare questo tipo di sintassi durante lo sviluppo di applicazioni iPhone e iPad.<\/p>\n<p>Alla prossima!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Salve a tutti, in questo mio primo articolo vi propongo un argomento molto interessante: parleremo dei blocchi&#8230;<\/p>\n","protected":false},"author":542,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[9],"tags":[615,602,614,5,616],"class_list":["post-6231","post","type-post","status-publish","format-standard","hentry","category-guide-teoriche","tag-blocchi-objective-c","tag-francesco-guida","tag-lezioni-teoriche-objective-c","tag-objective-c","tag-programmazione-block-based"],"acf":[],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/6231","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/users\/542"}],"replies":[{"embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/comments?post=6231"}],"version-history":[{"count":8,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/6231\/revisions"}],"predecessor-version":[{"id":6241,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/6231\/revisions\/6241"}],"wp:attachment":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/media?parent=6231"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/categories?post=6231"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/tags?post=6231"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}