我正在对一个对象执行异步方法,当我的请求完成时,我将结果打印在标签中。我的问题是:如果我启动我的请求然后删除我的对象,我的 setText 方法会崩溃(因为我的对象已被释放)。
即使我的对象已被释放,我怎样才能避免这种崩溃?
有什么测试要做吗?
我正在对一个对象执行异步方法,当我的请求完成时,我将结果打印在标签中。我的问题是:如果我启动我的请求然后删除我的对象,我的 setText 方法会崩溃(因为我的对象已被释放)。
即使我的对象已被释放,我怎样才能避免这种崩溃?
有什么测试要做吗?
1)在请求完成之前不要删除您的对象:)
2) 取消请求(根据您的对象并不总是可行)
如果您的对象被释放并且它当前是视图上的子视图,则视图本身已被销毁,您将无处显示标签内容。为什么会这样取决于你的应用程序的设计,但通常你的代码可以检测到视图的删除,如果你知道它已经消失,你应该将任何对视图的引用设置为 nil。
如果标签尚未添加到视图中 - 那么您需要保留标签,以便您可以在其上设置文本并在包含视图上调用 addSubview。
此外,如果用户操作会导致视图被删除 - 显示一个微调器并阻止用户这样做,因为他们调用的请求正在进行中。
解决方案是在“init”或“viewDidLoad”方法中创建一个 NSMutableArray 对象。当您想要移除对象时,请务必在将其从父视图中移除后将其放入此数组中。然后在您的异步方法中(最好在主线程上运行以打印结果),它做的最后一件事是 [storageArray removeObject:object],释放它。
异步请求可以保留对象,直到它完成。