gpt4 book ai didi

iOS - 无法消除内存泄漏

转载 作者:行者123 更新时间:2023-11-28 23:01:44 25 4
gpt4 key购买 nike

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

tags = [myTagMgr getMyTags];

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

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

我在这个方法中遇到了 myTags 的内存泄漏。我应该在哪里释放内存? “标签”是在整个 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;
}

最佳答案

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

@property (nonatomic, strong) NSMutableDictionary *tags; 

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

此外,除非您使用的是 ARC,否则您需要自动释放 myTags:

return [myTags autorelease];

哦,如果您不使用 ARC,则需要确保在 dealloc 中释放 tags

关于iOS - 无法消除内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9893362/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com