Comments 12
… и вот мы видим, во что выливаются замыкания в языках с ручным управлением памятью. Еще 10 метров веревки чтобы уж наверняка ноги-то себе поотстреливать.
0
благо они есть :)
0
Не в языках с ручным управлением памятью, а в Obj-C. C++0x лямбды имеют достаточно прозрачную семантику и способ захвата указывается в самом замыкании, а не в объявлении переменной. Сами лямбды тоже можно передавать как по значению так и по ссылке/указателю.
Причем как для самих лямбд так и для захваченных свободных переменных применяются те же правила, основанные на здравом смысле, что и для всех остальных объектов: делать объект, живущий меньше, чем ссылки/указатели на него — ОЧЕНЬ плохая идея.
Причем как для самих лямбд так и для захваченных свободных переменных применяются те же правила, основанные на здравом смысле, что и для всех остальных объектов: делать объект, живущий меньше, чем ссылки/указатели на него — ОЧЕНЬ плохая идея.
+1
Уже не актуально, Apple представила (точнее представит, пока это под NDA для разработчиков) на днях ARC (Automatic Reference Counting) — теперь ручным управлением памяти занимается компилятор, не нужно больше самому следить за тем, где и когда вставлять захват и освобождение объектов. До кучи еще был и есть сборщик мусора же.
Ну и по правде говоря сложного в этом ничего нет же, разве что у новичков которые с наскока пытаются перейти с какой-нибудь системы где подобного нет, а так не бывает.
Ну и по правде говоря сложного в этом ничего нет же, разве что у новичков которые с наскока пытаются перейти с какой-нибудь системы где подобного нет, а так не бывает.
0
Не могу найти нормальной информации о ARC, что именно это будет из себя представлять? GC может?
0
А вы зарегистрированы в Mac Dev Program? Описание представлено в разде pre-release и не доступно вне программы.
Вообше суть такая — в процессе компиляции компилятор сам проставит где нужно retain/release/autorelese. Для свойств добавлены новые спецификаторы, собственно как и при объявлении каких-то обычных локальных переменных. NSAutoreleasePool теперь тоже вне игры (хотя на самом деле просто сделали очередной syntactic sugar в виде @autoreleasepool). В общем, никакого GC (я кстати с момента его появления так и не успел его попробовать).
Вообше суть такая — в процессе компиляции компилятор сам проставит где нужно retain/release/autorelese. Для свойств добавлены новые спецификаторы, собственно как и при объявлении каких-то обычных локальных переменных. NSAutoreleasePool теперь тоже вне игры (хотя на самом деле просто сделали очередной syntactic sugar в виде @autoreleasepool). В общем, никакого GC (я кстати с момента его появления так и не успел его попробовать).
0
Жаль нет поддержки weak для IOS 4.0, очень надеюсь на то что это дело поправят, если это возможно.
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"
}
+1
Sign up to leave a comment.
Articles
Change theme settings
О блоках и их использовании в Objective-C часть 1-ая