Вопрос по iphone, ios, objective-c – Сохранение блока в переменной экземпляра

3

Как мы объявляем глобальную (частную переменную экземпляра), чтобы принять блок в нем. Нужно ли нам это обобщать и каковы последствия для управления памятью.

У меня есть блок, полученный от стороннего метода, который я хочу сохранить в переменной экземпляра и использовать его на более позднем этапе.

Ваш Ответ

2   ответа
2

Blocks Programming Topics:

Вы можете копировать и освобождать блоки, используя функции C:

Block_copy();
Block_release();

Если вы используете Objective-C, вы можете отправить блокcopy, retain, а такжеrelease (а такжеautorelease) Сообщения

Чтобы избежать утечки памяти, вы всегда должны балансироватьBlock_copy() сBlock_release(). Вы должны сбалансироватьcopy илиretain сrelease (илиautorelease) - если только не в мусорной среде.

Это хорошо. Внутри того же класса контроллера я хочу сохранить блок, полученный в одном методе, чтобы позже я мог использовать его в другом методе. Как я должен это сделать. Я думал о сохранении блока в некоторой переменной экземпляра и последующем его использовании. Abhinav
Ты не можешь использоватьretain, release илиautorelease в среде ARC. Abizern
Видеть / Stackoverflow.com вопросы / 8360998 / ... а также / Stackoverflow.com вопросы / 9701923 / ... если вы используете ARC. Hailei
12

сле выполнения некоторой работы в фоновом режиме:

Worker.h:

@interface Worker : NSObject
{
    void (^completion)(void);
}
@property(nonatomic,copy) void (^completion)(void);
- (void)workInBackground;
@end

Worker.m:

@implementation Worker
@synthesize completion;

- (void)dealloc
{
    Block_release(completion);

    [super dealloc];
}

- (void)setCompletion:(void (^)(void))block
{
    if ( completion != NULL )
        Block_release(completion);

    completion = Block_copy(block);
}

- (void)workInBackground
{
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void)
    {
        // Do work..

        dispatch_async(dispatch_get_main_queue(), completion);
    });
}

@end

Похожие вопросы