从项目的视图控制器中删除所有 -viewDidUnload 的方法

Posted

技术标签:

【中文标题】从项目的视图控制器中删除所有 -viewDidUnload 的方法【英文标题】:Way to remove all -viewDidUnload from project's view controllers 【发布时间】:2013-09-28 02:19:54 【问题描述】:

正如苹果官方文档所说:

-viewDidUnloadios 6.0 中已弃用。在内存不足的情况下不再清除视图,因此永远不会调用此方法。

同时,最好从部署目标为 iOS 6.0 或更高版本的项目中删除所有 -viewDidUnload 实现。但是一个一个移除它很无聊,尤其是你有数百个控制器和几个项目。

那么,有什么脚本或命令可以做这个批处理作业吗?

【问题讨论】:

【参考方案1】:

我为 Vim 找到了一个命令,我相信它会让你的生活更轻松。 ;)

在所需的根目录中打开 Vim(通常,它将是您所有控制器文件的根目录),按 Shift : 进入命令行模式,运行以下命令:

:args **/*.m | argdo %s/^-\ (void)viewDidUnload\_.\-\n^$\n//ge | update

这将全部替换

- (void)viewDidUnload

  [super viewDidUnload];
  ...

// a blank line here

清空,换句话说,-viewDidUnload sn-p 将被删除。 但请注意,工具后面有一个空行。如果您不想包含它,请使用

:args **/*.m | argdo %s/^-\ (void)viewDidUnload\_.\-//ge | update

改为。

注意:当您在项目的根目录中时,这也将包括 lib 文件。我建议转到你的控制器的根目录,然后是所有文件,你会对结果感到满意。 ;)


提示:

之后,您最好检查是否所有-viewDidUnload 都被删除,在您想要的根目录的终端上运行以下命令:

$ find . -type f -iname "*.m" -exec grep -i "viewDidUnload"  +

它应该没有输出。否则,某些目标会丢失,您可以轻松找到它,因为它会列出所有未正确管理的文件,然后手动将其删除(如果您的 - (void)viewDidLoad-(void)viewDidLoad 没有空格或其他内容,则可能会发生这种情况)。

终于可以运行了

$ git diff -b --color-words

查看结果。好好享受! ;)


进一步阅读命令

args **/*.m:设置 arglist 以包含当前目录及其子目录中的所有 .m 文件; argdo:对 arglist 中的所有参数运行以下命令; %s/^-\ (void)viewDidUnload\_.\-\n^$\n//ge: Vim RegEx 替换 -viewDidUnload 执行 sn-p 为空; \_.:查找任何字符,包括换行符(换行符)。 \-:尽可能少匹配(停在第一个,例如\-h将停在第一个h); :最后匹配的项目; \n:换行; ^$\n:空行。 update:仅当缓冲区已被修改时才保存修改。

参考

Search Across Multiple Lines Search and Replace in Multiple Buffers

【讨论】:

以上是关于从项目的视图控制器中删除所有 -viewDidUnload 的方法的主要内容,如果未能解决你的问题,请参考以下文章

从 Parse Array 中删除项目后 UITableView 崩溃

删除 NSManagedObject 时的附加操作

从父级删除后保留的子视图控制器

如何从 Xcode 中的不同视图控制器禁用工具栏项目 [重复]

从 RecyclerView 中删除与 List 无关的视图

为啥数据不从视图传递到控制器