2013-04-04 5 views
0

Я учусь Objective C.Objective разница между C * и^

Просто интересна разница между * и ^.

Знаю ли я, что * означает, что точка памяти в памяти?

NSString *test = [[NSString alloc] init]; 

Но сегодня я столкнулся ^ символ. Кто-нибудь может объяснить, пожалуйста?

-(void) sort 
{ 
    [book sortUsingComparator: 
    ^(id obj1, id obj2) { 
     return [obj1 compareNames: obj2]; 
    } ]; 
} 

ответ

4

* предназначен для простого старого указателя 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-функция, а затем имя , используемое в вызове метода. Но, похоже, большинство разработчиков этого не делают.

+0

Спасибо за подробное объяснение. – Bruce

2

* используется для указателя, а также для размножения.

NSString *test = [[NSString alloc] init]; 

Здесь test является указателем на NSString.


^(id obj1, id 

^ используется для createblock.


Если вы знакомы с C/C++, то:

Вот Pointer декларация C Функция ...

void (*func)(void); 

и вот блок декларации ...

void (^block)(void);