草庐IT

ios - ARC 下的内存管理良好实践

coder 2024-01-12 原文

我的问题更侧重于导航堆栈场景……比方说,我有一个包含多个表格单元格的主视图。每个单元格通过将其推送到导航堆栈来导航到一个新 View ,其 View Controller 将数据和 subview 存储在多个 NSMutableArrayNSArray 中。应用程序的常见流程是在主视图 Controller 和另一个 View Controller 之间来回切换,这是一个常见的场景。考虑到我在 ARC 下,我会很感激关于我在这种情况下执行的内存管理操作的一些建议:

a) 我应该执行哪些“清洁”工作人员?是否建议在 View 消失时清理数组,或者最好保留它们以防用户再次导航到 View ?

b) 关于 View 和 subview ,当 View 消失时我是否也应该“nilify”它们?所有这些,包括那些在 nib 文件中定义的,还是仅那些我在代码中创建的?

谢谢

最佳答案

当弹出一个细节 View 时,好的做法是释放内存。如果在您的详细 View Controller 中(并且只有在那里)您对数据(您的集合)有强引用,它们将在弹出时自动释放。

导航 Controller 保持对推送 View Controller 的强引用,当您弹出它时,它会清除该引用。由于唯一保持对您的集合的强引用的对象是 View Controller 本身,因此它们也会在弹出时被释放。

但是,如果您的一个详细 View Controller 中的数据需要时间设置(例如下载)并且用户频繁地返回和前进到那个 View ,那么好的做法是保持它在内存中。您可以通过在主视图 Controller ( TableView Controller )中保持对详细 View Controller 的强引用来实现这一点。确保只创建一次重 View Controller 并始终推送相同的实例。

如果您保持对大量细节 View Controller 的强引用以使应用程序更快,那么您应该在主 TableView Controller 的 - (void)didReceiveMemoryWarning 中将该引用置零。如果未将 View Controller 压入堆栈,内存将自动回收。 (如果用户想再次输入,请确保重新创建 View Controller )。

问题 b 的答案 不,通常您不会取消您的引用资料。如上所述,如果拥有数组的 Controller 被释放,它将自动释放任何强属性。

如果您想保留繁重的 View Controller ,则主 TableView Controller 中的代码示例:

// MainTableViewController.m

#import "MainTableViewController.h"

@interface MainTableViewController()

@property (nonatomic, strong) UIViewController *myHeavyViewController;

@end

@implementation MainTableViewController

- (UIViewController *)myHeavyViewController
{
    //
    // A getter for the strong myHeavyViewController property. Creates the
    // view controller if needed, or returns it if it already exists.
    //
    if (!_myHeavyViewController) {
        self.myHeavyViewController = ... // Create everything needed
    }
    return _myHeavyViewController;
}

- (void)didReceiveMemoryWarning
{
    //
    // Nil property if we get a memory warning
    //
    self.myHeavyViewController = nil;
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (indexPath == /* Index path for the heavy view controller */) {

        //
        // self.myHeavyViewController always calls the getter above
        //
        [self.navigationController pushViewController:self.myHeavyViewController animated:YES];
    }
}

@end

关于ios - ARC 下的内存管理良好实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20115466/

有关ios - ARC 下的内存管理良好实践的更多相关文章

  1. ruby-on-rails - 使用 Ruby on Rails 进行自动化测试 - 最佳实践 - 2

    很好奇,就使用ruby​​onrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提

  2. ruby-on-rails - Ruby net/ldap 模块中的内存泄漏 - 2

    作为我的Rails应用程序的一部分,我编写了一个小导入程序,它从我们的LDAP系统中吸取数据并将其塞入一个用户表中。不幸的是,与LDAP相关的代码在遍历我们的32K用户时泄漏了大量内存,我一直无法弄清楚如何解决这个问题。这个问题似乎在某种程度上与LDAP库有关,因为当我删除对LDAP内容的调用时,内存使用情况会很好地稳定下来。此外,不断增加的对象是Net::BER::BerIdentifiedString和Net::BER::BerIdentifiedArray,它们都是LDAP库的一部分。当我运行导入时,内存使用量最终达到超过1GB的峰值。如果问题存在,我需要找到一些方法来更正我的代

  3. ruby - i18n Assets 管理/翻译 UI - 2

    我正在使用i18n从头开始​​构建一个多语言网络应用程序,虽然我自己可以处理一大堆yml文件,但我说的语言(非常)有限,最终我想寻求外部帮助帮助。我想知道这里是否有人在使用UI插件/gem(与django上的django-rosetta不同)来处理多个翻译器,其中一些翻译器不愿意或无法处理存储库中的100多个文件,处理语言数据。谢谢&问候,安德拉斯(如果您已经在ruby​​onrails-talk上遇到了这个问题,我们深表歉意) 最佳答案 有一个rails3branchofthetolkgem在github上。您可以通过在Gemfi

  4. ruby - 如何验证 IO.copy_stream 是否成功 - 2

    这里有一个很好的答案解释了如何在Ruby中下载文件而不将其加载到内存中:https://stackoverflow.com/a/29743394/4852737require'open-uri'download=open('http://example.com/image.png')IO.copy_stream(download,'~/image.png')我如何验证下载文件的IO.copy_stream调用是否真的成功——这意味着下载的文件与我打算下载的文件完全相同,而不是下载一半的损坏文件?documentation说IO.copy_stream返回它复制的字节数,但是当我还没有下

  5. ruby-on-rails - Ruby 中的内存模型 - 2

    ruby如何管理内存。例如:如果我们在执行过程中采用C程序,则以下是内存模型。类似于这个ruby如何处理内存。C:__________________|||stack|||------------------||||------------------|||||Heap|||||__________________|||data|__________________|text|__________________Ruby:? 最佳答案 Ruby中没有“内存”这样的东西。Class#allocate分配一个对象并返回该对象。这就是程序

  6. ruby-on-rails - 获取 inf-ruby 以使用 ruby​​ 版本管理器 (rvm) - 2

    我安装了ruby​​版本管理器,并将RVM安装的ruby​​实现设置为默认值,这样'哪个ruby'显示'~/.rvm/ruby-1.8.6-p383/bin/ruby'但是当我在emacs中打开inf-ruby缓冲区时,它使用安装在/usr/bin中的ruby​​。有没有办法让emacs像shell一样尊重ruby​​的路径?谢谢! 最佳答案 我创建了一个emacs扩展来将rvm集成到emacs中。如果您有兴趣,可以在这里获取:http://github.com/senny/rvm.el

  7. Ruby 文件 IO 定界符? - 2

    我正在尝试解析一个文本文件,该文件每行包含可变数量的单词和数字,如下所示:foo4.500bar3.001.33foobar如何读取由空格而不是换行符分隔的文件?有什么方法可以设置File("file.txt").foreach方法以使用空格而不是换行符作为分隔符? 最佳答案 接受的答案将slurp文件,这可能是大文本文件的问题。更好的解决方案是IO.foreach.它是惯用的,将按字符流式传输文件:File.foreach(filename,""){|string|putsstring}包含“thisisanexample”结果的

  8. ruby-on-rails - 事件管理员日期过滤器日期格式自定义 - 2

    是否有简单的方法来更改默认ISO格式(yyyy-mm-dd)的ActiveAdmin日期过滤器显示格式? 最佳答案 您可以像这样为日期选择器提供额外的选项,而不是覆盖js:=f.input:my_date,as::datepicker,datepicker_options:{dateFormat:"mm/dd/yy"} 关于ruby-on-rails-事件管理员日期过滤器日期格式自定义,我们在StackOverflow上找到一个类似的问题: https://s

  9. 叮咚买菜基于 Apache Doris 统一 OLAP 引擎的应用实践 - 2

    导读:随着叮咚买菜业务的发展,不同的业务场景对数据分析提出了不同的需求,他们希望引入一款实时OLAP数据库,构建一个灵活的多维实时查询和分析的平台,统一数据的接入和查询方案,解决各业务线对数据高效实时查询和精细化运营的需求。经过调研选型,最终引入ApacheDoris作为最终的OLAP分析引擎,Doris作为核心的OLAP引擎支持复杂地分析操作、提供多维的数据视图,在叮咚买菜数十个业务场景中广泛应用。作者|叮咚买菜资深数据工程师韩青叮咚买菜创立于2017年5月,是一家专注美好食物的创业公司。叮咚买菜专注吃的事业,为满足更多人“想吃什么”而努力,通过美好食材的供应、美好滋味的开发以及美食品牌的孵

  10. Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting - 2

    1.错误信息:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:requestcanceledwhilewaitingforconnection(Client.Timeoutexceededwhileawaitingheaders)或者:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:TLShandshaketimeout2.报错原因:docker使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里

随机推荐