【发布时间】:2014-06-04 09:28:40
【问题描述】:
我对惰性属性有疑问。我以为我得到了它们,但也许我没有/也许这是一个错误
我的班级中有一个惰性数组
@lazy var enteredRegions = Array<String>()
现在
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: NSDictionary?) -> Bool
我有
self.enteredRegions.append(clRegion!.identifier);
这会因 EXC_BAD_ACCESS 严重崩溃。
现在如果我删除 @lazy:
var enteredRegions = Array<String>()
所有作品
所以..这是怎么回事? :D 我的理解是self.enteredRegions 无论如何都会创建它
(我使用 UIWindow 和 CLLocationManager 执行此操作,并且按我的想法工作)
【问题讨论】:
-
@lazy用于昂贵的操作,因此在调用属性之前不会运行。创建数组并不是一项昂贵的操作,因此无论如何您都不应该需要 @lazy。此外,在我的所有测试中,@lazy 仅适用于类。 -
@AlexReynolds 听起来很合理,但要么不应该被允许,要么不应该崩溃
-
是的,但这可能是保留计数问题。所以它可能是允许的,但由于保留计数没有增加,它被释放,因此访问不正确。这也不是@lazy 属性的目的。阵列没有什么是昂贵的。由于内存管理和运行时,许多导致崩溃的事情都是允许的
-
@AlexReynolds 这是懒惰的一种用途,但还有其他用途。 Apple 的文档说明了多种用途:“当属性的初始值依赖于外部因素时,惰性属性很有用,这些因素的值在实例初始化完成后才知道。当属性的初始值需要复杂时,惰性属性也很有用或计算量大的设置,除非需要,否则不应执行”。
标签: swift