*
предназначен для простого старого указателя c. ^
предназначен для блока (proc, замыкание, лямбда). В частности, блок Objective-C реализуется как закрытие.
^
- это, по сути, указатель на функцию с некоторыми связанными с масштабами побочными эффектами, которые дискретно копируют необходимые объекты и примитивы, так что, когда вызывается блок (функция), переменные в блоке являются копиями тех, которые были во внешней области, где был определен блок.
Блоки - очень большая и сложная тема в Objective-C. Вы можете найти краткий обзор here.
БОЛЬШОЙ всеобъемлющий материал можно найти в документации Apple в формате here.
EDIT:
В вашем конкретном примере ...
-(void) sort
{
[book sortUsingComparator:
^(id obj1, id obj2) {
return [obj1 compareNames: obj2];
} ];
}
Метод sortUsingComparator:
принимает анонимный блок в качестве параметра. Упрощенная подпись блока - ^(id obj1, id obj)
. Упрощенное значение: поскольку возвращаемый тип равен void
, его можно опустить.То, что делает этот пример запутанным для многих людей, состоит в том, что блок фактически определен в строке, прямо посреди вызова метода.
Этот код будет легче читать, если блок был сначала объявлен с описательным именем, а затем определен как любая другая c-функция, а затем имя , используемое в вызове метода. Но, похоже, большинство разработчиков этого не делают.
Спасибо за подробное объяснение. – Bruce