我应该如何存储大字符串,如用户协议?

时间:2012-10-19 03:40:49

标签: ios memory-management text nsstring

我可以使用像@"content"这样的字符串文字,但我认为这是浪费内存。是否有针对这种情况的自定义解决方案?

我是一个新的Xcoder,所以可能这不是一个好问题,但我对使用NSString非常困惑......

2 个答案:

答案 0 :(得分:4)

将文本放入文件中。假设您将文件命名为userAgreement.txt。确保该文件是目标的一部分(在主编辑器中打开文件时,请检查文件检查器的目标成员资格部分。)

在运行时读取文件的内容,如下所示:

NSString *path = [[NSBundle mainBundle] pathForResource:@"userAgreement" ofType:@"txt"];
NSString *userAgreement = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:NULL];

此方法的一个特性是您可以本地化文件,此代码将自动为用户的区域设置选择适当的版本。

请注意,如果您要使用自定义最终用户许可协议(EULA),并且希望将此应用程序放入App Store,则必须在iTunes Connect的应用配置中输入EULA。

答案 1 :(得分:0)

我不是说其他​​答案都是错的,这可能就是我自己做的(从文件中加载EULA)。但是我想澄清一点,无论你将它保存在文件中还是字符串文字中,它都会使用相同数量的内存,只要你管理内存并以合理的方式创建对象图。

如果您担心内存使用情况,您仍然可以将其作为字符串文字;只需在自己的'myEula'类中将其定义为属性,将字符串文字类放在-init方法中,如果使用手动引用计数,请确保它已被释放。

然后,当您需要向用户显示协议时,创建myEula类的新实例,访问相应的属性,然后释放它,或者删除引用并让它被垃圾收集。

您也可以在用于显示EULA的视图控制器中定义它,您可能只会在内存中保留一段时间。纯粹主义者会告诉你这违反了模型 - 视图 - 控制器,但如果文本是不可变的,我认为这不是什么大问题。

它会浪费内存的唯一方法是,如果它被定义为永久保留在内存中的对象中的字符串文字,就像你的app代理一样,或者你是否一直将所有视图保存在内存中 - 但这可能意味着你有比这个字符串文字更大的问题。