【问题标题】:a macro to get the weak type for a block获取块的弱类型的宏
【发布时间】:2014-01-20 10:29:34
【问题描述】:

我想知道创建 __weak 版本以在块内使用以避免保留循环所需的所有样板。 我使用的经典方式是:

__weak typeof(self) weakSelf = self;

我的直接解决方案是定义一个新函数,例如:

#define weakTypeof(type) __weak typeof(type)

好的,这不是一个很大的改进,但我们不得不在任何地方输入__weak,如下所示:

weakTypeof(self) weakSelf = self;

我有什么理由不应该这样做吗?
有没有更好/更有效的方法来做到这一点?

【问题讨论】:

    标签: ios objective-c macos objective-c-blocks weak-references


    【解决方案1】:

    我只是在 Xcode 中使用代码 sn-ps http://nshipster.com/xcode-snippets/

    当我在您粘贴的代码中键入 weakSelf 时,我设置了一个,这样可以节省时间。

    【讨论】:

      【解决方案2】:

      我认为它可能同样容易编写:

      __weak typeof(self) weakSelf = self;
      

      这是单行样板代码,任何阅读您的代码的人都可以立即理解。而且,如果您使用 sn-ps,则几乎不需要任何可观的时间来编写。

      如果您使用宏,您最终会得到与原始语句几乎相同长度的代码,因此您没有获得太多时间并且牺牲了可读性,因为您仍然需要知道宏的作用。

      所以,在我看来(你知道我对我的意见的看法),这不是你需要担心的事情。尝试精简它并没有任何收获。

      编辑

      补充我的断言。我敢肯定,您有很多类似的内容:

      @property (strong, nonatomic) UIView *someSubview;
      @property (weak, nonatomic) id<SomeDelegateProtocol> delegate;
      @property (copy, nonatomic) NSString *someString;
      

      如果您认为为这些设置宏是一个的想法,那么您可以编写:

      propStrong UIView *someSubview;
      propWeak id<SomeDelegateProtocol> delegate;
      propCopy NSString *someString;
      

      然后继续为您的 weakSelf 声明实现一个宏。

      但是,如果您认为原始版本只是普通的样板,如果写得更长一点,则完全可读,并且每个人乍一看都明白,那么我认为您不必担心未加修饰的 weakSelf 声明。

      【讨论】:

        【解决方案3】:

        虽然我同意@abizern 的回答,即代码的可读性胜过编写速度,但我从project 中找到了一个有趣的方法,为了争论,我认为发布它是个好主意。 作者在这里创建了一个宏来制作变量的弱副本,例如@weakify(&lt;a_variable&gt;),然后使用@weakify(&lt;a_variable&gt;) 在块内引用它。 这个项目也包含在 ReactiveCocoa 中并被广泛使用。

        源文件中有很多宏,主要是为了处理您实际上可以使用多个变量作为参数调用@weakify()@strongify(),但我设法在此处减少了此示例中的所有代码:

        #define metamacro_concat(A, B) A ## B
        #define weakify(VAR) \
          autoreleasepool {} \
          __weak __typeof__(VAR) metamacro_concat(VAR, _weak_) = (VAR)
        #define strongify(VAR) \
          autoreleasepool {} \
          _Pragma("clang diagnostic push") \
          _Pragma("clang diagnostic ignored \"-Wshadow\"") \
          __strong __typeof__(VAR) VAR = metamacro_concat(VAR, _weak_)\
          _Pragma("clang diagnostic pop")
        

        ...

        NSString *string = @"test";
        
        @weakify(string);
        
        [anyObject asyncBlock:^{
        
            @strongify(string);
            NSLog(@"%@", string);
        }];
        

        【讨论】:

          猜你喜欢
          • 2012-08-28
          • 2015-06-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-01-29
          • 1970-01-01
          • 2017-05-01
          • 2020-02-19
          相关资源
          最近更新 更多