Saving a block in instance variable

后端 未结 2 1972
时光取名叫无心
时光取名叫无心 2021-01-20 06:17

How do we declare a global(private instance variable) to accept a block in it. Do we need to synthesis it & what are the memory management implications with it.

2条回答
  •  佛祖请我去吃肉
    2021-01-20 06:56

    Here's an (ARC-less) example of storing a block for a completion callback after doing some work in the background:

    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
    

提交回复
热议问题