在创建闭包并存储它时保持对象的引用

时间:2018-03-05 19:04:13

标签: swift closures capture-list

我有一个问题,关于如何在特定示例中的闭包中处理对象的引用。下面的代码被简化以演示这个想法

class SomeObject {
    init(value: Int) {
        self.value = value
    }
    var value: Int {
        didSet {
            valueObservers.forEach { $0(value) }
        }
    }
    var valueObservers = [(Int) -> Void]()
}

class TestClass {

    let obj1 = SomeObject(value: 1)
    let obj2 = SomeObject(value: 2)
    let obj3 = SomeObject(value: 3)

    func valueOfObjectChanged(object: SomeObject) {
        print("Value of object \(object) is \(object.value)")
    }

    init() {
        let objects = [obj1, obj2, obj3]
        objects.forEach { (object) in
            object.valueObservers.append { [unowned self] (_) in
                self.valueOfObjectChanged(object: object)
            }
        }
    }
}

所以我们这里有一个类SomeObject,它可以存储一个闭包数组,当它的变量值发生变化时会执行。 TestClass创建了一些这些对象,然后从这个对象生成数组,并且对于这个数组中的每个对象,它添加了一个闭包,当任何这些TestClass的值时,它将执行SomeObjects的函数。 1}}改变。

现在可以在任何创建的对象触发的函数内部,我想确定我知道哪个对象确实导致它执行。引用在函数执行中传递,但请注意object这里是从循环获取并传递给闭包(闭包将执行valueOfObjectChanged并将对象引用作为参数传递)。

问题是什么 - 我不确定对象的引用是否真的会被保存为正确的对象,因为这个闭包执行的地方与创建闭包时完全不同。

我无法将object放入此约capture list,因为这会导致Segmentation fault: 11

我不确定在这种情况下闭包会如何表现 - 会保留对象的引用,还是会出错?

我还可以在valueObservers的定义中添加调用者,但由于应用程序的当前结构,这是我想要避免的(示例只是简化)。

所以我的问题是 - object object.valueObservers.appendobjects.forEach的引用总是正确的,指向对象,改变了它的值,或者它是不正确的,例如点到public class AutoMapperModule : Module { protected override void Load( ContainerBuilder builder ) { base.Load( builder ); var assemblies = AppDomain.CurrentDomain.GetAssemblies(); builder.RegisterAssemblyTypes( assemblies ) .Where( t => typeof(Profile).IsAssignableFrom( t ) && !t.IsAbstract && t.IsPublic ) .As<Profile>(); builder.Register( c => new MapperConfiguration( cfg => { //cfg.ConstructServicesUsing( CSContainer.Instance.Resolve ); foreach( var profile in c.Resolve<IEnumerable<Profile>>() ) { cfg.AddProfile( profile ); } } ) ) .AsSelf() .AutoActivate() .SingleInstance(); builder.Register( c => c.Resolve<MapperConfiguration>().CreateMapper( c.Resolve ) ) .As<IMapper>() .SingleInstance(); } } 或其他东西中迭代的最后一个对象?

0 个答案:

没有答案