【问题标题】:What is the proper way to manage memory of a class variable / method in objective c?在目标 c 中管理类变量/方法的内存的正确方法是什么?
【发布时间】:2009-05-31 22:06:11
【问题描述】:

我正在学习 Objective - C 并且来自垃圾收集的世界。我正在创建一个字典的类(静态)变量,我不确定我是否正确地进行内存管理。我正在使用一种方便的方法,因此应该自动释放该对象,但我真的不知道是否需要在我的类中释放或保留它。

我找不到关于如何管理类级别对象的明确文档 - 任何建议都值得赞赏。谢谢。

+(NSDictionary*) polygonNames{        
        NSDictionary* polygonNames = [NSDictionary dictionaryWithObjectsAndKeys:
                                      @"Triangle", @"3",
                                      @"Square", @"4",
                                      @"Square", @"4",
                                      @"Pentagon", @"5",
                                      @"Hexagon", @"6",
                                      @"Heptagon", @"7",
                                      @"Octagon", @"8",
                                      @"Nonagon", @"9",
                                      @"Decagon", @"10",
                                      @"Hendecagon", @"11",
                                      @"Dodecagon", @"12",
                                      nil];
        return polygonNames;

    }

【问题讨论】:

  • 这段代码没有任何问题,只是每次调用都会创建字典。
  • 没有回答你的问题,但是——我看到你将每个多边形的边数存储为一个字符串。如果您真的想存储一个数字,请将其包装在 NSNumber 中,即 [NSNumber numberWithInt:1] 等。
  • 感谢您的数字建议,当我仍然认为 obj c 中字典的键必须是字符串时,快速查看文档和您的评论清除了这一点。跨度>

标签: objective-c memory-management


【解决方案1】:

如果您的数据结构是不可变的并且不会改变,您可以使用 static 变量,如下所示:

+ (NSDictionary *) polygonNames
{
    static NSDictionary *polygonNames = nil;
    if (!polygonNames) polygonNames = [[NSDictionary alloc] initWithObjectsAndKeys:/* objects and keys */];
    return polygonNames;
}

【讨论】:

  • 谢谢 - 这很有帮助。我关心的是它的“生命”。考虑到它在所有实例中都是静态的,我是否需要释放它,或者它在程序结束时“释放”就足够了。我假设它是第一次请求类的任何实例时创建的?再次感谢 - b
  • 它会一直存在直到应用程序终止,这很好——如果你不释放经常分配的东西,内存泄漏只是大问题(本身)。对于单例(在内存中只存在一次的东西),实际上不释放它们并依赖系统释放它使用的少量内存是相当普遍的。为了回答您的第二个问题,这会在第一次请求时分配值。如果你使用线程,你可能想看这里:alanquatermain.net/post/114613488/…
  • 非常感谢,这些答案很有帮助。
【解决方案2】:

我可以推荐网站 CocoaDev.com。您将在其中找到以下经验法则:

  • 如果您分配、保留或复制它,释放它是您的工作。否则不是。
  • 如果您分配、保留或复制它,释放它是您的工作。否则不是。是的:再读一遍!

搜索“经验法则”。因为我不允许添加超链接..

基本上所有名为dictionary*array* 等的类方法都会返回一个您不必保留/释放的自动释放对象。

为了进一步阅读,我可以推荐“内存管理”页面。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-02-27
    • 2018-10-30
    • 2011-08-29
    • 1970-01-01
    • 2021-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多