【问题标题】:Memory leak for object in array数组中对象的内存泄漏
【发布时间】:2011-03-08 11:08:38
【问题描述】:

我已经开始在发布之前清理我的应用程序 - 使用“仪器”泄漏分析器。

我发现了一个无法堵住的泄漏点。所以我建立了一个简单的项目来说明这个问题。请看下面的代码。我在视图上放了一个按钮来测试触发程序“测试”。它总是会产生泄漏。

首先是名为“theObj”的对象的标头和代码

#import <Foundation/Foundation.h>


@interface theObj : NSObject {

NSString* theWord; } @property (nonatomic,retain) NSString* theWord;

@end

#import "theObj.h"


@implementation theObj
@synthesize theWord;

-(id) initWithObjects: (NSString *) aWord;
{
 if (self = [super init]){
  self.theWord = aWord;
 }
 return self;
}

-(void) dealloc{
[theWord release];
[super dealloc];
}

@end

现在是视图控制器

#import <UIKit/UIKit.h>
#import "theObj.h"

@interface LeakAnObjectViewController : UIViewController {
 NSMutableArray* arrObjects;
}
  - (IBAction)test;
@end

#import "LeakAnObjectViewController.h"

@implementation LeakAnObjectViewController

- (IBAction)test {  
 if (arrObjects == nil)
  arrObjects = [[NSMutableArray alloc] init];

 NSString* aStr = @"first";
 [arrObjects addObject:[[theObj alloc] initWithObjects:aStr]];
 [arrObjects removeAllObjects];
}  

【问题讨论】:

  • Objective-C?您可能应该标记语言(我会,但我不确定我猜对了)。
  • 您在提问时应该使用更多标签,这可以告诉其他人您正在使用的技术并提高获得答案的机会。

标签: objective-c memory-leaks


【解决方案1】:

有人真的需要学习the rules around memory management。特别是涉及所有权等。

【讨论】:

  • 请相信我——我今天已经读了 3 遍了——更不用说过去的遭遇了。让我感到不安的是,如果我添加 [aStr release];它没有任何效果 - 仍然会泄漏。
  • 你需要确保在适当的地方使用自动释放,在适当的地方保留等。如果你只是使用 alloc/init 而没有自动释放,那么你需要确保你有一个参考完成它,您可以自己释放它。当你以这种方式做事时,你就完全拥有了那个对象。如果你把东西放在集合中,你不应该这样做。这都包含在我链接到的规则中。
【解决方案2】:

您分配对象,这意味着您拥有它。然后你把它交给数组,这意味着数组也拥有它。然后数组将其删除,因此您是唯一的所有者。但是你没有对该对象的引用,所以你不能释放它,所以它只是泄露了。

【讨论】:

  • 所以我更改了代码以尝试释放有问题的字符串 - 但它仍然会产生泄漏。 - (IBAction)test { if (arrObjects == nil) arrObjects = [[NSMutableArray alloc] init]; NSString* aStr = @"first"; [arrObjects addObject:[[theObj alloc] initWithObjects:aStr]]; [arrObjects removeAllObjects]; [aStr 发布];
  • @manateeman:嗯,你刚刚为aStr 添加了一个版本。您的[theObj alloc] 仍然与发布不平衡。你需要做id temp = [[theObj alloc] initWithObjects:aStr]; [arrObjects addObject:temp]; [temp release];
  • OK Chuck - 非常感谢 - 解决了测试项目中的泄漏问题。我真的没有任何借口看不到树,只是森林挡住了路。现在我要回到现实世界,看看我能否为我的应用做点好事。
猜你喜欢
  • 2015-09-28
  • 2012-10-31
  • 1970-01-01
  • 2012-10-16
  • 1970-01-01
  • 2012-09-12
  • 2015-05-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多