2013-06-07 18 views
33

Mam pytanie dotyczące składni zmiennych __block. Wiem, że możesz używać __block dla zmiennej w zasięgu, więc nie jest ona tylko do odczytu wewnątrz bloku. Jednak w jednym miejscu w apple docs, widziałem alternatywę.Alternatywna składnia do __block?

„Zmienne w zakresie określającym są tylko do odczytu domyślnie podczas stosowanego w bloku Jeśli trzeba zmienić wartość takiej zmiennej, ty można użyć specjalnej składni:

int count = 0; 
float cumulativeValue = 0.0; 
UpdateElements(a, N, ^(float element){ 
    |count, cumulativeValue| 
    float value = factor * element; 
    ++count; 
    cumulativeValue += value; 
    return value; 
}); 

w tym przykładzie, liczyć i cumulativeValue są modyfikowane wewnątrz bloku, więc są one wliczone w oddzielonych przecinkami lista wspólnych zmiennych na początku zakresu bloku.

Ta składnia wydaje się być dużo czystsza i zakładam, że można wtedy zmodyfikować zmienne, które nie zostały zadeklarowane, ale nadal są w zakresie. Jednak nie widziałem tego nigdzie indziej, a kompilator xCode nie lubi mojego podstawowego bloku. Czy jest to prawidłowa składnia?

Odpowiedz

45

Wow. Nie widziałem tej składni od dłuższego czasu.

Była to jedna z wielu struktur składniowych analizowanych podczas tworzenia bloków. Ostatecznie został odrzucony, ponieważ był zbyt nieprecyzyjny w deklarowaniu zamiaru, a wynikłe z tego zachowanie byłoby mylące.

Rozważmy zakres z trzema blokami, z których dwa deklarują zmienną jako readwrite przez |a|. Nie byłoby sposobu, aby dowiedzieć się z deklaracji int a = 5; na górze zakresu, że wartość zmiennej jest readwrite w pewnym zakresie bloku.

Co więcej, znacznie utrudniałoby to wykonanie kompilatora. Tradycja w C jest taka, że ​​typ zapisu zmiennych jest ustalony w momencie deklaracji. Wspieranie tej składni przerwałoby to oczekiwanie.

Tak więc zdecydowano użyć modyfikatora typu pamięci podobnego do volatile lub static. __block został użyty przede wszystkim dlatego, że prefiks __ znacznie zmniejsza ilość kodu, który zostałby złamany przez dodanie gołego słowa kluczowego.

Dzięki za pytanie. Zgłoszony błąd i dokumentacja zostanie ostatecznie naprawiona i/lub usunięta.

+0

Bardzo ciekawe! Dzięki za historię –

+0

Więc, jakikolwiek pomysł, dlaczego dokumentacja została napisana przed sformalizowaniem składni? – CodaFi

+4

Jeśli ludzie dokumentujący nie potrafią wymyślić, jak wyjaśnić coś spójnie, jest to pewny znak, że projekt jest poważnie wadliwy, a zatem są one zaangażowane na wczesnym etapie procesu projektowania. Ta dokumentacja mogła być pierwotnie wyprodukowana dla WWDC, gdzie bloki zostały po raz pierwszy ogłoszone. – bbum

5

The | | Składnia została zainspirowana przez Smalltalk, tak jak to było, oczywiście, określenie "blok".

Jak zaznacza bbum, oznaczenie strony decl jest bardziej uczciwe w.r.t. użycie non-block i znacznie więcej zgodnie z C po modelowaniu, ponieważ zakończyło się, jako nowy (C) obiekt "duration".

http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1451.pdf