iOS在dispatch_async块之外释放变量init的位置

C. *_*ung 1 logging multithreading ios

我正在为iOS应用程序实现文件记录器.记录器是一个单例,它有一个成员变量dispatch_queue_t _queue负责将日志输出到文件,这样它可以确保线程安全,并且在写入日志时不会阻塞主线程或其他线程.

由于block没有参数,所以我不能va_start在块内做.在那种情况下,我必须message在块外面初始化.我对iOS中的块很新,不知道我应该在哪里发布message(at (1)或者(2),为什么?)

谢谢!

- (void)log:(NSString *)format, ...
{
    va_list args;
    va_start(args, format);

    NSString *message = [[NSString alloc] initWithFormat:format arguments:args];

    dispatch_async(_queue, ^{
        // output `message` to file

        // (1) release here?
        [message release];
    });

    // (2) or release here?
    [message release];

    va_end(args);
}
Run Code Online (Sandbox Code Playgroud)

pow*_*984 5

来自Apple的文档:

封闭词法范围本地的堆栈(非静态)变量被捕获为const变量.它们的值是在程序中的块表达点处获取的.在嵌套块中,从最近的封闭范围捕获值.

无需担心在块内释放消息.你可以安全地在街区外面释放它.

理想情况下,您只需转换为ARC而不用担心它.