Ios 在UIWebView上设置强NSBlockOperation。这是个坏主意吗?

Ios 在UIWebView上设置强NSBlockOperation。这是个坏主意吗?,ios,nsblockoperation,Ios,Nsblockoperation,我正在调试我的应用程序的一个有趣问题 该应用程序的目标是iOS6.1,它使用的是ARC。 这里是一些背景,因为它太大,无法复制粘贴到SO中 有一个仪表板类具有子视图控制器。这个子视图控制器相当大,它有两个按钮和两个滚动视图,这些视图是根据仪表板控制器交给它的CoreData对象动态创建的。当仪表板控制器与子控制器一起完成时,它会将其销毁,并使用不同的核心数据对象创建另一个仪表板控制器 动态创建并填充到UIScrollView中的子控制器中的一个视图是UIWebView的子类。我们称之为子网。创建

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

该应用程序的目标是iOS6.1,它使用的是ARC。 这里是一些背景,因为它太大,无法复制粘贴到SO中

有一个仪表板类具有子视图控制器。这个子视图控制器相当大,它有两个按钮和两个滚动视图,这些视图是根据仪表板控制器交给它的CoreData对象动态创建的。当仪表板控制器与子控制器一起完成时,它会将其销毁,并使用不同的核心数据对象创建另一个仪表板控制器

动态创建并填充到UIScrollView中的子控制器中的一个视图是UIWebView的子类。我们称之为子网。创建子Web实例时,它使用NSOperationBlock通过网络和其他内容(写入磁盘、加密等)执行一些文件获取。完成后,它需要能够将文件或网页插入子Web实例

我通过给SubWeb一个强属性来解决这个问题。这就是我的问题:我的清理永远无法销毁子视图控制器或子视图;我已经通过针对我的课程的仪器配置研究证实了这一点。通过创建和销毁子视图控制器(和子Web对象),我可以观察子视图控制器和子wWeb对象的内存分配,直到应用程序崩溃。奇怪的是,当我将NSBlockOperation设置为“弱”时,销毁例程会执行我所期望的操作

我需要强引用,因为我只需要先加载几个子Web对象,然后启动一个真正的文件,然后如果用户滚动到它们,我会通过按下

当未清理子视图控制器和子Web视图实例时,我指的是WebView:

#import <UIKit/UIKit.h>

@interface MySubWebView : UIWebView

@property (strong) NSBlockOperation *fileLoadOperation;

@end
#导入
@接口MySubWebView:UIWebView
@属性(强)NSBlockOperation*fileLoadOperation;
@结束
这是清理后的WebView(但是-现在,当我需要时,lazy Blocak操作为null):

#import <UIKit/UIKit.h>

@interface MySubWebView : UIWebView

@property (weak) NSBlockOperation *fileLoadOperation;

@end
#导入
@接口MySubWebView:UIWebView
@属性(弱)NSBlockOperation*fileLoadOperation;
@结束

唯一的区别是强类型和弱类型。有没有人使用过NSBLockOperation进行这种类型的延迟加载操作?有没有其他/更好的方法可以用来解决延迟加载问题?

我没有遵循您的逻辑来创建
NSBLockOperation
对象
。它通常应该是
。如果操作完成,则没有理由再保留操作对象

在回答有关内存消耗的问题时,您正在耗尽内存,因为您无疑有一个强引用周期(也称为保留周期)。如果块引用了
self
(无论是显式引用还是隐式引用控制器的一些实例变量),您可以以强引用循环结束(即,两个对象彼此保持强引用,因此,除非手动清理,否则任何对象都不会被解除分配。)


有关保留周期的信息,请参阅《高级内存管理编程指南》。另请参阅《使用Objective-C编程指南》。

有些NSBlockOps会立即启动,有些NSBlockOps可能需要稍后启动并执行网络请求,以便将文件加载到视图中。当块操作较弱并立即启动时最近没问题。默认情况下,我要加载的四个文件按预期加载。但是,分配给sub-classed web views属性的其余六个弱块操作为空,这些视图不在屏幕上,因此我不想获取文件,除非客户执行表示他们有兴趣查看的操作这些内容。我已经阅读了第一个链接,并将查看第二个链接,看看它是否对如何解决我在这种情况下正在解决的延迟按需加载用例有任何想法。对于处理具有文件列表的数据结构,您有何建议,其中一些文件需要在创建时通过网络获取,而另一些则需要在是否需要在稍后确定的时间提取?这正是我想要的,我怀疑我当前的方法可以改进,并且希望得到一些一般性的建议或战争故事,我可以用我正在使用的代码来探索。@hippee lee我只是在需要之前不会创建该操作。例如,当惰性加载时在表视图中,我不会创建检索图像的操作,直到我将该操作添加到队列中。谢谢@Rob。这是我在过去一个小时里一直在考虑的。我可能需要进行比我想要完成的更多的重构,尽管如此,所以我试图强制执行强操作。文件必须位于指定的位置ic顺序和其他业务要求。我的问题是,第一个要求是一次加载所有内容,因此将所有内容都放到队列中,并让回调块在准备就绪时自行排序是有意义的。现在,我半封闭地了解了它是如何做到这一点的,但更新后的要求是先加载四个,然后再加载其他部分r、 再次感谢您的回答。@hippee lee如果您坚持使用这种方法,它可以工作,但只需确保块中没有对
self
的强引用。请参阅我的回答中第二篇文章中的
weakSelf
的用法。另外,“使用生存期限定符以避免强引用周期”本节小节给出了更多的示例(不是
self
,而是关于防止块中保留循环的基本思想)。