iOS - 无法消除内存泄漏

时间:2012-03-27 16:06:43

标签: ios memory-leaks nsmutabledictionary

在我的TaggingScreen.m初始化函数中,我做 -

tags = [myTagMgr getMyTags];

在我的getMyTags方法中,我执行以下操作 -

NSMutableDictionary *myTags = [NSMutableDictionary new];
....
return myTags;

我在这个方法中遇到myTags的内存泄漏。我应该在哪里释放内存? “tags”是在整个TaggingScreen类中使用的属性。因此,如果我进行自动释放,当我尝试访问该类的其他方法中的标记时,我会收到一条异常,说“发送到解除分配的实例的消息”。

修改

- (NSMutableDictionary *)getMyTags
{

NSMutableDictionary *myTags=[NSMutableDictionary new];
NSFetchRequest *fetchRequest = [[[NSFetchRequest alloc] init]autorelease];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Tag" 
                                inManagedObjectContext:localObjectContext];
[fetchRequest setEntity:entity];

NSError *error = nil;
NSArray *fetchedArrayObjects = [localObjectContext executeFetchRequest:fetchRequest error:&error];

if (fetchedArrayObjects ==nil) {
    return nil;
}   
if ([fetchedArrayObjects count]==0) {
    return nil;
}   

Tag *aMessage; 
for (int i=0; i<[fetchedArrayObjects count];i++) 
{
    aMessage= (Tag *)[fetchedArrayObjects objectAtIndex:(NSUInteger)i];

    [myTags setValue:[aMessage isSet] forKey:[aMessage tagName]];
    }
return myTags;
}   

4 个答案:

答案 0 :(得分:1)

如果您使用init方法执行此操作,则可以执行以下操作:

tags = [[myTagMgr getMyTags] retain];

代替您的getMyTags方法

return [myTags autorelease];

通过这种方式,您的NSDictionary获得+1,您可以在控制器中使用self.tags访问它。

,其中

@property (nonatomic, retain) NSDictionary* tags;

请务必在dealloc

中发布
- (void)dealloc
{
   [tags release]; tags = nil;
   [super dealloc];
}

P.S。我假设你不使用ARC。

答案 1 :(得分:1)

Vignesh和Vin的解决方案是正确的,但根据您所说的,最好的办法是将tags更改为strong属性:

@property (nonatomic, strong) NSMutableDictionary *tags; 

除非您处于可能出现保留循环的情况(例如,委托对象),否则您应该使用strong,这样您的属性就不会从您下面取消分配。

此外,除非您使用ARC,否则您需要自动发布myTags

return [myTags autorelease];

哦,如果你没有使用ARC,你需要确保在tags中发布dealloc

答案 2 :(得分:0)

尝试:

return [myTags autorelease];

答案 3 :(得分:0)

您应该在方法中autorelease。如果您需要它,您必须在retain处调用它。

tags = [[myTagMgr getMyTags] retain];