Я думаю, что в основном все сводится к вопросу о вашей отправной точке.Если вы начинаете с Objective-C и пишете C ++ (Objective-C ++) в основном (или исключительно) как дополнение к Objective-C, тогда использование блоков во всем коде может иметь смысл, просто чтобы сохранить как можно больше общности.через базу кода.Даже если (например) проект использовал некоторые фрагменты, написанные на Objective-C, а другие на C ++, может иметь смысл использовать блоки в обоих, сохраняя как можно больше сходства во всей кодовой базе.
Однако, если вы не используете их вне C ++, я не вижу особых причин отдавать предпочтение блокам над C ++ lambdas.В том, что я считаю наиболее распространенным использованием (предикат или действие в алгоритме), единственное заметное различие между ними состоит в том, что один начинается с ^
, а другой - с []
.
* 1008.* Старые версии Objective C ++
До ARC существовали внутренние различия в реализации блоков и лямбд, которые могли повлиять на некоторые более сложные применения.Например, блоки работали неопределенно, как строки C, поэтому вы использовали Block_copy для копирования одного, Block_release для освобождения копии и так далее.С другой стороны, в C ++ все это автоматизировано, поэтому копирующий ctor автоматически использует Block_copy и dtor Block_release по мере необходимости.В то же время, он включал немного больше «волшебства», поэтому (например), когда вы копируете блок, копия всегда выделяется динамически, независимо от того, как был выделен источник.
Если, дляпо той или иной причине вы застряли с использованием более старого (я испытываю желание сказать «древний») компилятора или поддержки более старого кода (и не хотите обновлять кодовую базу в целом), разница в управлении памятью может стоитьс учетом.