我有一个问题,关于如何在特定示例中的闭包中处理对象的引用。下面的代码被简化以演示这个想法
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.append
下objects.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();
}
}
或其他东西中迭代的最后一个对象?