Привязка объекта к блоку - PullRequest
       22

Привязка объекта к блоку

1 голос
/ 23 ноября 2011

У меня есть следующий объект:

Someobject *Object = [[Someobject alloc] init];

void (^Block)() = ^()
{
    Use(Object);
};

DoSomethingWith(Block);

Блок копируется в DoSomethingWith и где-то сохраняется.он может быть не вызван, вызван один раз или вызван несколько раз.Я хочу связать Object с блоком, чтобы при каждом освобождении блока или любой из его копий Object и при сохранении или копировании блока или любой из его копий Object будет сохраняться.
Есть ли способ сделать это?

1 Ответ

3 голосов
/ 23 ноября 2011

Измените вашу первую строку на [[[Someobject alloc] init] autorelease] и все готово.

Блоки сохраняют объекты, объявленные без ссылки на тело, и освобождают их при освобождении. Так будет копия блока, сделанная в пределах DoSomethingWith. Если предположить, что копия в конечном итоге будет выпущена, утечки нет. Это довольно круто.

(Исключение: если Object было объявлено __block Someobject *Object, наряду с ожидаемым эффектом (удаляя const из частной ссылки блока, позволяя блоку присвоить Object), это поведение автоматического сохранения также переключается выкл. В этом случае удержание / освобождение является вашей ответственностью снова.)

...