在我的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;
}
答案 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];