首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >快速选择器和闭包讨论

快速选择器和闭包讨论
EN

Stack Overflow用户
提问于 2015-02-28 04:12:50
回答 1查看 2.1K关注 0票数 1

我找了很多东西却没有发现任何真正能解决我问题的东西.

我正试图从头开始构建一个简单的UIControl,就像一个UIButton。由于特殊原因,它不能是UIControl的子类。

我需要这个控制来做这样的事情:

代码语言:javascript
复制
myControl.addTarget(target: AnyObject?, action: Selector, forControlEvents: UIControlEvents)

问题是,当单击按钮时执行此选择器的方法的实现需要"performSelector:“方法。

斯威夫特没有"performSelector:“。所以我教它可以用闭包来实现。

我不知道如何捕获我想要在闭包中修改的对象。我不知道我会如何处理引用周期和其他类似的事情。

我甚至不知道我是否走上了成功的道路。我相信你们能让我走上正轨!

我来自巴西,为我糟糕的英语感到难过!谢谢!:D

到目前为止.

代码语言:javascript
复制
struct ClosureForEvent {
    var closure:(control:MyControl!)->()
    var event:UIControlEvents 
}

class MyControl {
     private var closures:[ClosureForEvent]?

     init() {}

     func addClosureFor(event:UIControlEvents, closure:(control:MyControl!)->()) {

          if closures == nil {
              closures = [ClosureForEvent(closure: closure, event: event)]
          }
          else {
              closures!.append(ClosureForEvent(closure: closure, event: event))
          }
      }


      func executeClosuresOf(event:UIControlEvents) {
          if closures != nil {
              for closure in closures! {
                  if closure.event == event {
                      closure.closure(control: control)
                  }
              }
          }
      }
  }

  class Test {
       var testProperty = "Default String"

       init() {
            let control = MyControl()
            control.addClosureFor(UIControlEvents.TouchUpInside, closure: { (control) -> () in
            self.testProperty = "This is making a reference cycle?"
            })
       }
  }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-02-28 05:10:57

在目前的情况下,似乎没有形成循环引用。但将来可能会意外地形成。就像下面的例子。

代码语言:javascript
复制
// In the `Test` class.
let control = MyControl()
init() {
    control.addClosureFor(UIControlEvents.TouchUpInside, closure: { (control) -> () in
        self.testProperty = "This is making a reference cycle?"
    })
}

在此代码中,self作为其字段引用control,而control通过addClosureFor添加的闭包引用self。这样就形成了循环引用,因此循环中的这些对象永远不会被释放。

闭包捕获列表有助于此问题。

代码语言:javascript
复制
control.addClosureFor(UIControlEvents.TouchUpInside) { [weak self] /* <-- */ control -> () in
    // Here, `self` is visible as `Optional<Test>` so the `?` operator is required.
    self?.testProperty = "This is making a reference cycle?"
    return
}

在上述代码块中,self被弱捕获,因此从selfcontrol只形成一个单向引用。注意,现在在闭包中,对self的访问没有得到保证,因为self是弱引用的。您必须将self视为一个可选值。

Language/AutomaticReferenceCounting.html

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28778010

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档