0

我正在调试我的应用程序的一个有趣问题。

该应用程序针对 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 进行这种类型的延迟加载操作?有没有一种不同/更好的方法可以用来解决延迟加载?

4

1 回答 1

1

我没有遵循您制作NSBlockOperation对象的逻辑strong。一般应该是weak。如果操作完成,就没有理由再保留操作对象了。

在回答有关您的内存消耗的问题时,您的内存不足是因为您无疑有一个强大的参考周期(也称为保留周期)。如果块有一个引用self(无论是显式地还是隐式地通过引用控制器的一些实例变量),您最终会得到一个强引用循环(即两个对象保持对彼此的强引用,因此两者都不会得到除非您手动清理它,否则已解除分配。)

有关保留周期的信息,请参阅高级内存管理编程指南中的使用弱引用来避免保留周期。另请参阅使用 Objective-C 编程指南中的在捕获时避免强引用循环self

于 2013-06-22T01:22:35.997 回答