Блоки и объекты в Objective-C

#objective-c #xcode #function #lambda #objective-c-blocks

#objective-c #xcode #функция #лямбда #objective-c-блоки

Вопрос:

Я начал изучать, как использовать блоки / функции / лямбда в Objective-C. Но я не могу заставить его работать с объектами. Возможно, мне не хватает какого-то указателя, но он не работает, однако я делаю. На данный момент это мой код:

 MyEventArgs (^skapaEventArg)(Operation); 
skapaEventArg = ^(Operation a) { return *[[MyEventArgs alloc] initWithOperation:a]; };
MyEventArgs *a = skapaEventArg(Add);
  

Но я получаю ошибку, показанную на этом рисунке:

Если я сделаю

 MyEventArgs a = skapaEventArg(Add);
  

чтобы поместить его в стек, Xcode выдает мне обычную «Интерфейс не может быть статически выделен» -ошибка

Как мне заставить этот простой код работать, используя блоки?

Ответ №1:

Это должно быть:

 MyEventArgs *(^skapaEventArg)(Operation); 
skapaEventArg = ^(Operation a) { return [[MyEventArgs alloc] initWithOperation:a]; };
MyEventArgs *a = skapaEventArg(Add);
  

Обратите внимание на * в первой строке и его отсутствие во второй строке.

Комментарии:

1. Ах! Спасибо. Я знал, что с моими указателями что-то не так. Это была одна из тех комбинаций, которые я не пробовал. Но я понимаю, почему. Возврат должен быть указан как указатель в объявлении.

Ответ №2:

 return *[[MyEventArgs alloc] initWithOperation:a];
  

Я думаю, вы получаете ошибку «несовместимый тип», потому что вы возвращаете указатель с разыменованием.