В чем разница между функцией / методом и блоком в цели c или Swift?

-1

Я изучаю цель c и быстро. я не понял, какая разница между блоком и методом или функцией в Objective c или Swift.

int mutiplier=10;

int (^myBlock)(void)=^{

    return 10 *3;
};
NSLog(@"%d",myBlock());

Или можете написать метод/функцию, подобную этой

-(int)function:(int)num{

    return num* 10;
}

Blockquote

  • 0
    взгляните на этот ответ. stackoverflow.com/a/39611258/4003548 .
  • 0
    Это мое узкое понимание темы, но я думаю, что методы и блоки концептуально очень похожи. Другие языки имеют такие понятия, как «лямбда-функции» или «замыкания», которые тоже очень похожи. Я думаю, один из способов думать о блоках - это безымянные функции, которые, помимо того, что являются безымянными, сохраняют локальную область видимости.
Теги:
objective-c-blocks

2 ответа

1

Короткие и простые:

  1. Блок кода - всего лишь блок кода. Вы можете объявить об этом, определить типы блоков (затем создать экземпляры), блоки вызовов по одному и т.д. Блоки могут принимать параметры, могут что-то возвращать, довольно удобно использовать их вместе с Grand Central Dispatch. Блоки могут быть объявлены прямо в середине кода, как переменная экземпляра или как свойство. Они также могут передаваться как аргументы вызова метода/функции. После того, как блок выполнил свою работу, вы можете вызвать часть "завершения" для запуска определенного кода, что удобно в некоторых случаях. В быстром языке, подобном блокам (но не равным), это закрытие. Хотелось бы добавить, что в Objective-c существует подход к подсчету на основе блоков, который почти так же быстро, как и быстрое перечисление. Порекомендовал бы быстрое перечисление в большинстве случаев, но иногда (редкое) перечисление блоков лучше. Другие циклы обычно происходят не так быстро, как эти два. Еще одна важная вещь, которую мы должны иметь в виду, состоит в том, что блоки являются объектами Objective-C, а функции и методы - нет. Блоки могут захватывать значения из переменных из охватывающей области, а для получения тех же значений внутри функции/метода, которые необходимо передать этим переменным в качестве аргументов. Используя блоки, вы можете даже изменить эти переменные, используя fe

    __block int anInteger = 123; 
    

    перед вызовом блока. Имейте в виду, что вы избегаете сильной ссылки на self захватывая его внутри блока, чтобы избежать удержания циклов. В этом случае используйте weakSelf. https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/ProgrammingWithObjectiveC/WorkingwithBlocks/WorkingwithBlocks.html

  2. Функция должна иметь имя, возвращать что-то или быть недействительным.

  3. Метод - это функция класса.

  • 0
    Спасибо Александр
  • 0
    Добро пожаловать!
0

Блоки - это способ обернуть кусок кода и эффективно сохранить его для последующего использования. Вместо функции обратного вызова обычно используется блок. Новые API-интерфейсы в iPhone SDK используют блоки таким образом. API возьмет "блок" кода, который будет запущен по завершении. И блоки представлены быстро, как закрытие.

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

Это избавляет вас от необходимости создавать собственные потоки и поддерживать состояние каждого потока, управлять блокировками, настраивать пулы автозапуска и т.д.

Кроме того, при использовании с блоками API Grand Central Dispatch (GCD) API можно запускать в очередях, и все части кода могут выполняться для асинхронного запуска с минимальными усилиями, но при этом сохраняя надежность, требуемую для многопоточного кода.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню