【问题标题】:Worth converting NSMutable<T> to NS<T>值得将 NSMutable<T> 转换为 NS<T>
【发布时间】:2012-01-31 19:46:47
【问题描述】:

我了解内存管理的基础知识,但不了解 iOS 如何处理不同数据类型的内部知识。有些事情总是让我烦恼,最好使用NSData vs NSMutableDataNSString 而不是NSMutableString。除非代码将在 10k 循环中运行或者我在浪费时间,否则真的会有任何性能差异吗?

【问题讨论】:

    标签: objective-c performance cocoa-touch memory-management


    【解决方案1】:

    在您希望能够就地更改内容的地方使用可变类型。否则使用不可变类型。

    在某些情况下,您别无选择 - 例如保存从 NSURLRequest 返回的数据的数据对象:使用可变数据对象比创建大量不可变数据类型并将它们连接起来要容易得多结束。

    之后,通过分析器运行您的代码,看看您是否应该做一些不同的事情。即创建新的不可变类型来保存对象的开销是否比使用可变类型更有效。其他任何事情都是过早的优化。

    【讨论】:

    • 我真的在谈论当我拥有我一直在用一种方法处理的数据并将其传递回另一种方法时。
    • @Echilon 正如我所说,这取决于您在做什么。如果您要返回数据的方法需要就地修改,请返回一个可变对象。就个人而言,当我传递数据类型时,我倾向于保持数据类型不可变。我更喜欢属性的不可变类型。使事情更加线程安全,并且在值从不同的地方得到锤击的情况下,它使调试更容易。可变/不可变类集群有方法 copymutableCopy 非常方便。
    • 这里的第一句话是关键:想想你想用数据做什么。如果它需要可变,则使其可变。
    【解决方案2】:

    就像你说的,如果你多次调用 use Mutable,它唯一的价值。但是,如果你只调用它几次,这不是任何问题。

    您应该考虑替代方案,例如在更大的 TableViews cellForRowAtIndexPath: 方法中。使用[NSString stringWithFormat:@"%@%@", fristString, secondString],而不是*foo = [[NSMutableString alloc] init][foo append:firstString]等等。

    【讨论】:

    • 以TableView为例似乎没有多大意义,因为单元格的缓存和重用以及仅呈现可见单元格。
    • 完全没有,如果您构建应该通过 NSMutableString 显示的字符串。
    • 我不明白你的意思。每个 runloop 只会更改一次 tableview - 所以不是很频繁。
    • 好吧,我看到 TableViews 不是一个很好的例子,因为用户必须滚动才能调用此方法。这并不多;)最终,如果您有一个很长的列表(超过大约 5 个屏幕页面)并且您滚动得非常快,这可能是一个问题。
    • 无论哪种方式,您的示例都不是很有利。 [firstString stringByAppendingString:secondString] 可能会比您提供的任何一个选项都好。
    猜你喜欢
    • 2021-12-02
    • 1970-01-01
    • 2014-10-04
    • 2012-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多