可以阻止捕获CoreFundation对象吗?

时间:2014-09-29 00:18:20

标签: ios objective-c automatic-ref-counting objective-c-blocks core-foundation

Apple's doc中,当我想要捕获 CoreFoundation 对象时,我无法找到我能做的事情。

但是在Apple的Concurrency Programming Guide中。当调度对象不支持ARC时,示例代码似乎使用了一些代码:

   void average_async(int *data, size_t len, dispatch_queue_t queue, void (^block)(int))

   {

        // Retain the queue provided by the user to make

        // sure it does not disappear before the completion

        // block can be called.

        dispatch_retain(queue);


        // Do the work on the default concurrent queue and then

        // call the user-provided block with the results.

        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

           int avg = average(data, len);

           dispatch_async(queue, ^{ block(avg);});



           // Release the user-provided queue when done

           dispatch_release(queue);

       });
   }

我之前是否需要像CFObject一样使用DispatchObject。但是如果我需要多次调用该块?

也许我可以使用__attribute__((NSObject)),但我不知道会发生什么!

Apple会说些什么吗?

2 个答案:

答案 0 :(得分:2)

我没有明确地看到Apple的任何内容,但我确实看到了一些mentions in the llvm.org documentation,我在in this cocoa-dev mailing list thread上详细说明了这一点。

看起来你应该可以使用__attribute__((NSObject)),因为它有一个隐含的“__strong”资格(来自文档)和实际意义上(来自邮件列表线程),块排队时保留对象,块结束时释放。

答案 1 :(得分:1)

首先,dispatch_queue_t不是Core Foundation对象。

编译器将Dispatch对象视为Objective-C对象(用于ARC和块目的)if your deployment target is iOS 6+ / OS X 10.8+