【问题标题】:weakSelf when setting frame设置框架时的weakSelf
【发布时间】:2014-02-06 13:17:51
【问题描述】:

我最近阅读了this post,并认为使用文章中的提示是个好主意。我在块中使用它,但我也应该在下面的“块”中使用它。下面的“块”是真正的块吗?

avatar.frame = ({
    CGRect frame = avatar.frame;
    frame.origin.y = CGRectGetMaxY(self.view);
    frame;
});

那会变成:

__weak typeof(self)weakSelf = self;
avatar.frame = ({
    __strong typeof(weakSelf)strongSelf = weakSelf;

    CGRect frame = avatar.frame;
    frame.origin.y = CGRectGetMaxY(strongSelf.view);
    frame;
});

【问题讨论】:

  • 不,它不是真正的 objc 块。这是编译器扩展允许的。你不必虚弱地自我。
  • @MaciejOczko 谢谢,但我必须定期进行,对吧?
  • @yoeriboven:这实际上取决于块的使用方式。块是同步执行还是异步执行?它是否存储在某个集合中以供以后执行?您是否想要保持对自我的强烈引用?没有“一刀切”的答案。

标签: ios objective-c block


【解决方案1】:

这不是块。它是一个 GCC C 扩展,会导致 代码块 如果括在方括号和圆括号中,则返回一个值。

这不仅将配置细节分离到初始化中, 但额外的范围允许通用变量名称,如框架, 按钮,并在后续初始化中重用视图。不再 loginButtonFrame = ... / signupButtonFrame = ...!

来源:http://nshipster.com/new-years-2014/

【讨论】:

    【解决方案2】:

    这不是块,块以^开头。 我相信这段代码:

    ({
        CGRect frame = avatar.frame;
        frame.origin.y = CGRectGetMaxY(self.view);
        frame;
    });
    

    是一种创建CGRect的方法。

    【讨论】:

    • 不一定是坏事。它是一个“复合语句表达式”,例如允许您在表达式中使用局部变量。
    • @MartinR 是的,我检查了这个并修改了我的答案。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多