【问题标题】:Memory leak when returning object返回对象时内存泄漏
【发布时间】:2011-01-26 22:29:09
【问题描述】:

在过去一周左右的时间里,我的内存泄漏一直很顽固。我有一个在名为“ArchiveManager”的类中使用的类方法,它将为我解压缩特定的 .dat 文件,并返回一个包含其内容的数组。方法如下:

+(NSMutableArray *)unarchiveCustomObject
{
     NSMutableArray *array = [NSMutableArray arrayWithArray:[NSKeyedUnarchiver unarchiveObjectWithFile:/* Archive Path */]];
     return array;
}

我知道我目前没有它的所有权,我将它归还。

 CustomObject *myObject = [[ArchiveManager unarchiveCustomObject] objectAtIndex:0];

然后,稍后当我在要使用的视图控制器中解压缩它时(我什至没有创建它的数组,也没有创建指向它的指针,我只是引用它以从返回的数组中获取一些东西通过 unarchiveCustomIbject (objectAtIndex)。这是 Instruments 调用内存泄漏的地方,但我看不出这是如何泄漏的!有什么想法吗?

提前致谢。

编辑:添加了 CustomObject initWithCoder:

-(id)initWithCoder:(NSCoder *)aDecoder
{
    if (self = [super init])
    {
        self.string1 = [aDecoder decodeObjectForKey:kString1];
        self.string2 = [aDecoder decodeObjectForKey:kString2];
        self.string3 = [aDecoder decodeObjectForKey:kString3];
        UIImage *picture = [[UIImage alloc] initWithData:[aDecoder decodeObjectForKey:kPicture]];
        self.picture = picture;
        self.array = [aDecoder decodeObjectForKey:kArray];
        [picture release];
    }
    return self;
}

编辑2:我做了CustomObject的跟踪,我意识到在我的应用程序中,另一个对象(OtherObject)有它的initWithCoder方法分配一个CustomObject的参数,使其保留那个CustomObject。它看起来像这样:

-(id)initWithCoder:(NSCoder *)aDecoder
{
     if (self = [super init])
     {
          self.customObject = [aDecoder decodeObjectForKey:kCustomObjectKey];
     }
}

【问题讨论】:

  • 你是在模拟器上测试还是在设备上测试?如果您使用的是模拟器,请在设备上尝试;模拟器经常给出错误的内存分析结果。
  • 能否贴出CustomObject的initWithCoder:方法实现?

标签: iphone objective-c memory-management return-value memory-leaks


【解决方案1】:

您是如何声明您的属性的?分配、保留、复制?如果需要,您确定在您的 dealloc 方法中释放所有这些吗?

【讨论】:

  • 都设置为retain,全部在dealloc中释放。
  • +1 Instruments 会告诉您泄漏的对象是在哪里创建的,而不是您上次丢失对它的引用的位置。如果您忘记在 dealloc 方法中 release 您的对象,那么您将泄漏一个对象,但它会显示该对象的创建位置。
  • 我取消/释放了所有这些,但是,它仍然导致泄漏。
【解决方案2】:

Instruments 到底告诉你什么泄露了?有没有可能是你的 CustomObject?

(顺便说一句——你的方法返回 NSMutableArray 而不是 NSArray 有什么原因吗?)

【讨论】:

  • 它告诉我大量对象正在泄漏,范围从 NSMutableArrays、CustomObject 等。它们都从同一个方法泄漏,并且随着我进一步深入堆栈跟踪,它确实说它正在泄漏CustomObject 的 initWithCoder 方法,但我已经检查过了,它不可能导致 -.-
  • 如果可变数组被泄露,那么嵌套在其中的任何对象也将被泄露,因为集合保留了它们的对象。所以我会专注于找出哪些数组正在泄漏以及为什么首先泄漏。
  • 但我并没有声明对其中任何一个的所有权。我从不在他们身上调用 alloc/init/retain/copy/new 等。如果我使用 alloc/init 归档数组并取消归档,它是否保持与归档时相同的保留计数?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-12-20
  • 1970-01-01
  • 2021-11-01
  • 2013-11-01
  • 1970-01-01
  • 2012-10-31
  • 1970-01-01
相关资源
最近更新 更多