【问题标题】:Question about memory usage关于内存使用的问题
【发布时间】:2011-01-10 03:51:16
【问题描述】:

我有以下方法:

+(NSMutableDictionary *)getTime:(float)lat :(float)lon {
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

    NSMutableDictionary *dictionary = [[NSMutableDictionary alloc] init];
    [dictionary setObject:hour forKey:@"hour"];
    [dictionary setObject:minute forKey:@"minute"];
    [dictionary setObject:ampm forKey:@"ampm"];

    return dictionary;
}

很多方法都被砍掉了,所以我想我需要池来存放方法中的一些其他东西。这是我的问题。我知道我需要释放以下对象:

[dictionary release];
[pool release];

但是,我不能在返回字典之前释放它,但是一旦我返回它,其余的方法就不会执行。我该怎么办?

【问题讨论】:

  • Objective-C 中的方法从不命名为get*,除非它们通过引用返回多个值。你也看不到这样的裸冒号。将您的方法命名为 timeForLatitude:longitude:
  • @bbum 感谢您的风格建议!

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


【解决方案1】:

您始终可以autorelease 字典,从而确保它至少保存在内存中直到getTime:: 返回。这很好地符合 Cocoa 上的内存范例,其中返回一个它创建(但不拥有)的对象的方法,在它不再需要它时调用autorelease

当然,请确保在从getTime:: 接收它的任何代码中保留该字典。

【讨论】:

  • +1 确保在自动释放字典之前释放池,否则字典将与池一起释放,导致很难找到问题。
  • 嗯,摆脱了游泳池,因为我决定不需要它。现在,当我致电 autorelease 时,它会导致我的应用程序崩溃。啊,记忆给我带来压力。 :)
  • 可能是因为它正在发布,但您的代码在某个地方仍然需要它。您是否缺少 getTime 返回的字典上的保留?
猜你喜欢
  • 2011-10-08
  • 2016-03-14
  • 2011-01-23
  • 2013-05-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-22
  • 2023-03-11
相关资源
最近更新 更多