iOS内存管理-viewDidUnload

发布于 2024-11-26 23:53:30 字数 379 浏览 4 评论 0原文

我有一个基于导航的应用程序。屏幕列表有一个带有书籍列表的UITableView。书籍列表位于通过执行 HTTP 请求动态构建的属性 NSArray 中。单击列表中的某一行时,将导航至详细信息屏幕。假设此时出现内存警告。当您返回屏幕 List 时,NSArray 为 nil,因为调用了 viewDidUnload,因此 List 将是空的。

处理这种情况的正确方法是什么?我不应该在 viewDidUnload 中将 NSArray 设置为 nil 吗?

I have a navigation based app. The screen List has a UITableView with a list of books. The list of books is in a property NSArray that was built dynamically by executing an HTTP request. When one clicks in one of the rows in the List, one'll navigate to the screen Details. Let's say there is a memory warning at this point. When you come back to the screen List, the NSArray is nil because viewDidUnload was called, so the List will be empty.

What is the correct way to handle this situation? Should I not set the NSArray to nil in viewDidUnload?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

胡渣熟男 2024-12-03 23:53:30

通常,您只会清空 IBOutlet UI 元素的属性。您还可以安全地清理可以在 -viewDidLoad 中重新创建的任何内容。但一般来说,该方法仅用于清理和释放与视图相关的内存,而不是视图控制器。

Typically you will only nil out properties for your IBOutlet UI elements. You can also safely clean up anything that you can recreate in -viewDidLoad. But generally speaking, this method is only for cleaning up and freeing memory related to the view, not the view controller.

伏妖词 2024-12-03 23:53:30

正确的方法不是将数据存储在 UIViewController 中,而是存储在另一个管理数据的对象中。

视图控制器充当模型和屏幕之间的链接。您不应该使用它来存储您的数据。

The correct way is not to store your data in a UIViewController, but in another object that manages your data.

A viewcontroller serves as a link between your model and your screen. You should not use it to store your data.

江城子 2024-12-03 23:53:30

通常我在 void dealloc() 中设置对象的 NS(Mutable)Array。
Nil 并释放(如果对象不是自动释放的)。

如果您使用uinavigationcontroller,视图将被推送,因此当您从详细视图返回时,通常您将拥有以前的数据,除非您放入视图中将出现刷新。

我的猜测是您在从 http 请求释放内存时遇到问题。

Usually I set NS(Mutable)Array of the objects in void dealloc().
Nil and release (if the object is not autoreleased).

If you use uinavigationcontroller, the view is pushed, so when you return from your detail view, normally you will have your previous data, unless you put in viewwillappear a refresh.

My guess is that you have a problem freeing the memory from the http request.

旧时浪漫 2024-12-03 23:53:30

如果您的数组是在 viewDidLoad 部分中构建的,那么您可以将其设置为 nil。当视图被调用时,它将被重建。

通常,您希望在 viewDidUnload 中将任何内容设置为 nil ,这些内容可以在 viewDidLoad 部分或 xib 文件中重建。

我建议像这样延迟初始化 -

- (NSArray *)bookArray {
    if (bookArray == nil) {
        bookArray = [[NSArray alloc] init];
    }
    return bookArray;
}

然后在 viewDidLoad 中:

self.bookArray = [NSArray arrayWithOjects:...,nil];

If you array is built in the viewDidLoad section then you can set it to nil. When the view is recalled it will be rebuilt.

Generally you want to set anything to nil in the viewDidUnload that can be rebuilt in either the viewDidLoad section or the xib file.

I would recommend initializing lazily though like this -

- (NSArray *)bookArray {
    if (bookArray == nil) {
        bookArray = [[NSArray alloc] init];
    }
    return bookArray;
}

then in the viewDidLoad:

self.bookArray = [NSArray arrayWithOjects:...,nil];
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文