Comments 12
… и вот мы видим, во что выливаются замыкания в языках с ручным управлением памятью. Еще 10 метров веревки чтобы уж наверняка ноги-то себе поотстреливать.
благо они есть :)
Не в языках с ручным управлением памятью, а в Obj-C. C++0x лямбды имеют достаточно прозрачную семантику и способ захвата указывается в самом замыкании, а не в объявлении переменной. Сами лямбды тоже можно передавать как по значению так и по ссылке/указателю.
Причем как для самих лямбд так и для захваченных свободных переменных применяются те же правила, основанные на здравом смысле, что и для всех остальных объектов: делать объект, живущий меньше, чем ссылки/указатели на него — ОЧЕНЬ плохая идея.
Причем как для самих лямбд так и для захваченных свободных переменных применяются те же правила, основанные на здравом смысле, что и для всех остальных объектов: делать объект, живущий меньше, чем ссылки/указатели на него — ОЧЕНЬ плохая идея.
Уже не актуально, Apple представила (точнее представит, пока это под NDA для разработчиков) на днях ARC (Automatic Reference Counting) — теперь ручным управлением памяти занимается компилятор, не нужно больше самому следить за тем, где и когда вставлять захват и освобождение объектов. До кучи еще был и есть сборщик мусора же.
Ну и по правде говоря сложного в этом ничего нет же, разве что у новичков которые с наскока пытаются перейти с какой-нибудь системы где подобного нет, а так не бывает.
Ну и по правде говоря сложного в этом ничего нет же, разве что у новичков которые с наскока пытаются перейти с какой-нибудь системы где подобного нет, а так не бывает.
Не могу найти нормальной информации о ARC, что именно это будет из себя представлять? GC может?
А вы зарегистрированы в Mac Dev Program? Описание представлено в разде pre-release и не доступно вне программы.
Вообше суть такая — в процессе компиляции компилятор сам проставит где нужно retain/release/autorelese. Для свойств добавлены новые спецификаторы, собственно как и при объявлении каких-то обычных локальных переменных. NSAutoreleasePool теперь тоже вне игры (хотя на самом деле просто сделали очередной syntactic sugar в виде @autoreleasepool). В общем, никакого GC (я кстати с момента его появления так и не успел его попробовать).
Вообше суть такая — в процессе компиляции компилятор сам проставит где нужно retain/release/autorelese. Для свойств добавлены новые спецификаторы, собственно как и при объявлении каких-то обычных локальных переменных. NSAutoreleasePool теперь тоже вне игры (хотя на самом деле просто сделали очередной syntactic sugar в виде @autoreleasepool). В общем, никакого GC (я кстати с момента его появления так и не успел его попробовать).
Жаль нет поддержки weak для IOS 4.0, очень надеюсь на то что это дело поправят, если это возможно.
Думаю стоит более добавить еще ряд моментов об которым можно и не задуматься сразу:
1. Переменные из контекста создания блока действительно делаются в виде констант, но для указателей используются не оба модификатора, поэтому значения куда они указывают можно менять, хотя сам адрес нет.
Отсюда вытекает что
2. Глобальные и статические переменные доступны полностью.
1. Переменные из контекста создания блока действительно делаются в виде констант, но для указателей используются не оба модификатора, поэтому значения куда они указывают можно менять, хотя сам адрес нет.
Отсюда вытекает что
2. Глобальные и статические переменные доступны полностью.
int globalInt = 0;
int main () {
static int staticInt = 0;
^ {
globalInt++;
staticInt++;
}();
printf("globalInt: %d\n", globalInt); // print "globalInt: 1"
printf("staticInt: %d\n", staticInt); // print "staticInt: 1"
}
Sign up to leave a comment.
О блоках и их использовании в Objective-C часть 1-ая