Как стать автором
Обновить

Комментарии 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 (я кстати с момента его появления так и не успел его попробовать).
Ну Слава Богу что без GC :), у меня много где логика программы завязана на удаления обьекта и метод dealloc.
Переход будет совершенно безболезненный и незаметный, в меню рефакторинга будет пункт который перелопатит весь проект и все обновит.
Поигрался, впечатлило, что-то подобное давно ждал от Apple, отсутствие dealloc в большинстве случаев — так точно.
Жаль нет поддержки weak для IOS 4.0, очень надеюсь на то что это дело поправят, если это возможно.
Думаю стоит более добавить еще ряд моментов об которым можно и не задуматься сразу:

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"
}

Да, спасибо за дельное замечание, я поправлю.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Изменить настройки темы

Истории