Какой смысл имеет этот блок в Objective-C? - PullRequest
0 голосов
/ 21 сентября 2010

Из документов :

int (^Multiply)(int, int) = ^(int num1, int num2) {
    return num1 * num2;
};
int result = Multiply(7, 4); // result is 28

Это выглядит только сложно - то же самое можно сделать с функцией или нет?Какой смысл в этом примере?

Ответы [ 4 ]

8 голосов
/ 21 сентября 2010

Сила блоков заключается в лексических замыканиях (также известных как лямбды в таких языках, как Python или C #).Таким образом, вы можете сделать

// within other code

int myVar;

int (^multiplyClosure)(int) = ^(int num1) {
    return num1 * myVar;
};

Затем вы можете передать этот блок, и он сохранит (копию) myVar.Таким образом, замыкание - это действительно код и контекст, и в этом заключается сила.

4 голосов
/ 21 сентября 2010

В этом конкретном примере даже функция была бы неуместной, поскольку она является базовой арифметикой. Однако этот пример служит для демонстрации синтаксиса и соглашений о вызовах для блоков.

Сами блоки более полезны в качестве обратных вызовов или в качестве «кода перетаскивания». Это способ делегирования и расширения кода без необходимости создания функций с сохранением состояния или делегирования классов, а также без необходимости предоставлять вездесущий аргумент void *contextInfo для каждого обратного вызова.

2 голосов
/ 21 сентября 2010

Цель этого примера - показать, как создаются блоки и что они могут делать.Это как пример «Привет, мир», который вы найдете почти в каждой книге, но не в реальном приложении.Это просто для иллюстрации концепции.

1 голос
/ 21 сентября 2010

В блоке нет проблем с синхронизацией.Учитывая, что вы делаете вещи в многопоточности, два параметра «Умножение» совместно используются другими потоками.Они не будут изменены другим потоком, так как они находятся в «замыкании», поэтому вам не нужно блокировать sth, и это сохранит код простым.

...