Jerry Lee

stay hungry,stay young.

Welcome to my world.


iOS中懒加载的使用

当实例化一个对象需要耗费很多资源,或者配置一次就要调用很多配置相关的方法而你又不想弄乱这些方法时,我们需要重写 getter 方法以延迟实例化,而不是在 init 方法里给对象分配内存。 运用懒加载可以很好的解决这一问题。 所谓的懒加载也可称为:延时加载,即当对象需要用到的时候再去加载。(本质就是重写对象的get方法,当系统或开发者 调用对象的get方法时,再去加载对象)。 需要注意的是:重写get方法时,先判断对象当前是否为空,为空的话再去实例化对象。

懒加载一般使用如下模板:

- (NSDateFormatter *)dateFormatter {
if (!_dateFormatter) {
_dateFormatter = [[NSDateFormatter alloc] init];
NSLocale *enUSPOSIXLocale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"];
[_dateFormatter setLocale:enUSPOSIXLocale];
[_dateFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss.SSS"];//毫秒是SSS,而非SSSSS
}
return _dateFormatter;
}

使用懒加载前你可能会将对象的实例化写到viewDidLoad,这与viewDidLoad中代码显得很冗余,并且耗用内存。 使用懒加载之后每个控件的getter方法中分别负责各自的实例化处理,代码彼此之间的独立性强,松耦合。 使用懒加载在某些情况下很不错,但是实际这样做之前应当深思熟虑。下面是使用延迟实例化的争议:

*getter 方法应该避免副作用。看到 getter 方法的时候,你不会想到会因此创建一个对象或导致副作用,实际上如果调用 getter 方法而不使用其返回值编译器会报警告 “Getter 不应该仅因它产生的副作用而被调用”。

*你在第一次访问的时候改变了初始化的消耗,产生了副作用,这会让优化性能变得困难(以及测试).

*这个初始化可能是不确定的:比如你期望属性第一次被一个方法访问,但是你改变了类的实现,访问器在你预期之前就得到了调用,这样可以导致问题,特别是初始化逻辑可能依赖于类的其他不同状态的时候。总的来说最好明确依赖关系.

*这个行为不是 KVO 友好的。如果 getter 改变了引用,他应该通过一个 KVO 通知来通知改变。当访问 getter 的时候收到一个改变的通知很奇怪。

最近的文章

多线程总结

iOS多线程的使用对于App性能优化有很重要的意义。使用线程可以把程序中占据时间长的任务放到后台去处理,如图片、视频的下载。发挥多核处理器的优势,并发执行让系统运行的更快、更流畅,用户体验更好。总结一下iOS里面常用的三种线程编程的技术。NSThread这种方案是经过苹果封装后的,并且完全面向对象的。可以直接操控线程对象,非常直观和方便。但是它的生命周期还是需要我们手动管理。使用NSThread创建有以下几种方式:1.创建一个NSTread类实例,然后调用start方法。{% highli...…

multi thread继续阅读
更早的文章

从UIAlertView实现来看对象关联和ReactiveCocoa

开发ios时经常用到UIAlertView类,该类提供了一种标准视图,可向用户展示警告信息。当用户按下按钮关闭视图时,需要用视图协议来处理此动作,但是, 要想设置好这个委托机制,就得把创建警告视图和处理按钮动作的代码分开。由于代码分作两块,所以读起来有点乱(更可怕的是一个控制器里面出现多个UIAlertView),比方说我们使用 UIAlertView时,都会这么写:- (void)askUserAQuestion{UIAlertView *alert = [[UIAlertView al...…

UIAlertView继续阅读