NSProxy 作为 Objective-C 的一个根类,本身只是提供了少量的几个方法和实现了 NSObject 协议的方法,很多方法的调用都找不到实现,从而触发消息转发的动作,因此适合作为消息转发的代理类。利用 NSProxy 适合做消息转发的特性,可以实现对象之间的弱引用和对象的延迟初始化。
实现弱引用(Weak Reference)
使用场景:在 View Controller 里面使用 NSTimer 每隔一定时间执行指定事件,由于 RunLoop 强引用 NSTimer,而 NSTimer 通过 Target 强引用 View Controller,导致 View Controller 释放不了,造成内存泄露。
|
|
这样子就可以打破 RunLoop 和 View Controller 之间的强引用了。
具体实现:
|
|
实现延迟初始化(Lazy Initialization)
使用场景:
- 第一种情况,在 [SomeClass lazy] 之后调用 doSomthing,首先进入 forwardingTargetForSelector,_object 为 nil 并且不是 init 开头的方法的时候会调用 init 初始化对象,然后将消息转发给代理对象 _object;
- 第二种情况,在 [SomeClass lazy] 之后调用 initWithXXX:,首先进入 forwardingTargetForSelector 返回 nil,然后进入 methodSignatureForSelector: 和 forwardInvocation: 保存自定义初始化方法的调用,最后调用 doSomthing,进入 forwardingTargetForSelector,_object 为 nil 并且不是 init 开头的方法的时候会调用自定义初始化方法,然后将消息转发给代理对象 _object;
|
|
具体实现(代码来源:Lazy Initialization for Objective-C):
LazyInitialization.h
|
|
LazyInitialization.m
|
|