我正在调试我的应用程序的一个有趣问题。
该应用程序针对 iOS6.1,并且使用 ARC。这是一些背景,因为它太大而无法将粘贴复制到 SO。
有一个具有子视图控制器的仪表板类。这个子视图控制器相当大,它有两个滚动视图,它们是根据仪表板控制器交给它的 CoreData 对象动态创建的。当仪表板控制器使用子控制器完成时,它会破坏它并创建另一个具有不同核心数据对象的控制器。
子控制器中动态创建并填充到 UIScrollView 中的视图之一是 UIWebView 的子类。让我们称之为 SubWeb。当创建 SubWeb 的实例时,它使用 NSOperationBlock 通过网络进行一些文件获取以及其他一些事情(写入磁盘、加密等)。完成后,它需要能够将文件或网页插入到 SubWeb 实例中。
我通过赋予 SubWeb 一个强大的属性来解决这个问题。这是我的问题:我的清理永远无法破坏子视图控制器或子视图;我已经通过针对我的班级的仪器分配研究证实了这一点。通过创建和销毁子视图控制器(和 SubWeb 对象),我可以观察子视图控制器和 Sub wWeb 对象的内存分配,直到应用程序崩溃。奇怪的是,当我将 NSBlockOperation 设置为 weak 时,destroy 例程会按照我的预期进行。
我需要强引用,因为我只用一个真实文件预先加载了几个 SubWeb 对象来启动,然后如果用户滚动到它们,我会通过推送属性来延迟加载所需的文件
当子视图控制器和 SubWeb 视图的实例未清理时,这是我指的 WebView:
#import <UIKit/UIKit.h>
@interface MySubWebView : UIWebView
@property (strong) NSBlockOperation *fileLoadOperation;
@end
这是清理后的 WebView(但是 - 现在,当我需要它们时,惰性 Blocak 操作为空:
#import <UIKit/UIKit.h>
@interface MySubWebView : UIWebView
@property (weak) NSBlockOperation *fileLoadOperation;
@end
唯一的区别是强类型和弱类型。有没有人使用过 NSBLockOperation 进行这种类型的延迟加载操作?有没有一种不同/更好的方法可以用来解决延迟加载?