swift学习日志—— lazy懒加载
懒加载或者说延时初始化是很常用的优化方法,在构建和生成新的对象的时候,内存分配会在运行时耗费不少时间,如果有一些对象的属性和内容非常复杂的话,这个时间更是不可忽略。另外,有些情况下我们并不会立即用到一个对象的所有属性,而默认情况下初始化时,那些在特定环境下不被使用的存储属性,也一样要被初始化和赋值,也是一种浪费。 在其他语言 (包括 Objective-C) 中懒加载的情况是很常见的。我们在第一次访问某个属性时,判断这个属性背后的存储是否已经存在,如果存在则直接返回,如果不存在则说明是首次访问,那么就进行初始化并存储后再返回。这样我们可以把这个属性的初始化时刻推迟,与包含它的对象的初始化时刻分开,以达到提升性能的目的。以 Objective-C 举个例子 (虽然这里既没有费时操作,也不会因为使用懒加载而造成什么性能影响,但是作为一个最简单的例子,可以很好地说明问题): // ClassA.h
@property (nonatomic,copy) NSString *testString;
// ClassA.m
- (NSString *)testString {
if (!_testString) {
_testString = @"Hello";
NSLog(@"只在首次访问输出");
}
return _testString;
}
在初始化 在 Swift 中我们使用在变量属性前加
我们在使用
lazy
作为属性修饰符时,只能声明属性是变量。另外我们需要显式地指定属性类型,并使用一个可以对这个属性进行赋值的语句来在首次访问属性时运行。如果我们多次访问这个实例的
str
属性的话,可以看到只有一次输出。
相比起在 Objective-C 中的实现方法,现在的 lazy 使用起来要方便得多。 另外一个不太引起注意的是,在 Swift 的标准库中,我们还有一组 func lazy<S : SequenceType>(s: S) -> LazySequence<S>
func lazy<S : CollectionType where S.Index : RandomAccessIndexType>(s: S)
-> LazyRandomAccessCollection<S>
where S.Index : BidirectionalIndexType>(s: S)
-> LazyBidirectionalCollection<S>
where S.Index : ForwardIndexType>(s: S)
-> LazyForwardCollection<S>
这些方法可以配合像
而如果我们先进行一次 //map结合lazy懒加载,性能优化 let data = 1...5 let result = data.lazy.map{ (i:Int) -> Int in print("操作完毕") 对于那些不需要完全运行,可能提前退出的情况,使用 lazy
来进行性能优化效果会非常有效。
//map结合lazy懒加载,性能优化 let data = 1...5 let result = data.lazy.map{ (i:Int) -> Int in print("正在处理:(i)") return i*2 } ("准备开始访问结果") for i in result{ if i==8{ //提前退出 break } ("操作后结果为("操作完毕")
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |