【问题标题】:Leak problem with initWithContentsOfFileinitWithContentsOfFile 的泄漏问题
【发布时间】:2010-02-18 05:43:16
【问题描述】:

我的应用运行良好,看起来还不错。但是在我用 Instruments 运行它之后,我发现它上面有很多泄漏。有几件事似乎没有错,如下面的代码。代码真的有问题吗?任何一个词都会对我有所帮助。

@interface GameData : NSObject
{
    NSDictionary* _data;
    NSDictionary* _localData;
}
@end

@implementation GameData

- (id) init
{
    NSString* dataFilename = [[NSBundle mainBundle]pathForResource:@"GameData" ofType:@"plist"];
    _data = [[NSDictionary alloc]initWithContentsOfFile:dataFilename]; // Leaks 48 bytes

    NSString* localDataFilename = [[NSBundle mainBundle]pathForResource:@"GameData-Local" ofType:@"plist"];
    _localData = [[NSDictionary alloc]initWithContentsOfFile:localDataFilename];

    return self;
}

- (void) dealloc
{
    [_data release];
    [_localData release];

    [super dealloc];
}

@end

【问题讨论】:

    标签: xcode memory-leaks


    【解决方案1】:

    某些操作可能会导致框架存储永远不会释放的静态数据结构。例如,-initWithContentsOfFile: 的实现可能会在第一次使用它时设置一些内部设置,然后这些设置会一直存在,直到应用程序终止,可能是出于性能优化的原因。这不是真正的泄漏,但泄漏检测软件有时会这样标记它。框架本身也有可能存在导致内存泄漏的错误,但这种情况很少见,尤其是对于像 NSDictionary 这样成熟的类。

    您的代码没有泄漏,据我所知这是正确的。如果您的 -dealloc 方法被调用(添加日志语句以确保),那么您正在履行合同的一部分,任何泄漏都不是您的错。

    可能值得使用 ObjectAlloc 工具,因为它可以让您更好地了解哪些对象被分配并在周围徘徊。

    【讨论】:

      猜你喜欢
      • 2011-08-27
      • 1970-01-01
      • 2012-05-22
      • 2012-06-12
      • 1970-01-01
      • 2010-10-03
      • 1970-01-01
      • 2016-07-28
      相关资源
      最近更新 更多