如何为 Objective-C++ 中的方法编写宏包装器

问题描述

我的工作代码库中有很多这样的内容

  __typeof(self) __weak weakSelf = self;
  dispatch_async(_queue,^{
    auto strongSelf = weakSelf;
    if (!strongSelf) {
      return;
    }
    [strongSelf doSomething:aParam paramB:paramB];
  });

我想用一个宏替换所有的样板文件。类似的东西:

#define RUN_SAFELY_ON_QUEUE(q_,METHOD)  \
  __typeof(self) __weak weakSelf = self; \
  dispatch_async(q_,^{                  \
  auto strongSelf = weakSelf;            \
  if (!strongSelf) {                     \
    return;                              \
  }                                      \
  METHOD()                               \
});                                      \

然后运行如下:

RUN_SAFELY_ON_QUEUE(_queue,[self doSomething:aParam paramB:paramB]);

目前,我收到错误"Called object type 'void' is not a function or function pointer"

我正在寻找的可能吗?

感谢您的帮助!

解决方法

这有效,并确保在参数周围添加 ():

    #define RUN_SAFELY(q_,METHOD)         \
    __weak __typeof(self) weakSelf = self; \
    dispatch_async((q_),^{                  \
        auto strongSelf = weakSelf;        \
        if (!strongSelf) {                 \
            return;                        \
        }                                  \
        (METHOD);                            \
    });                                    \

并像这样使用它:

RUN_SAFELY(dispatch_get_main_queue(),[self doSomething:aParam paramB:paramB]);

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...