如何解决内存泄漏周期

时间:2013-11-18 11:31:47

标签: ios objective-c

如何解决此类内存泄漏问题?请帮忙。

@interface ParseOperation () <NSXMLParserDelegate>
// Redeclare appRecordList so we can modify it.
@property (nonatomic, strong) NSArray *appRecordList;
@property (nonatomic, strong) NSData *dataToParse;
@property (nonatomic, strong) NSMutableArray *workingArray;
@property (nonatomic, strong) AppRecord *workingEntry;
@property (nonatomic, strong) NSMutableString *workingPropertyString;
@property (nonatomic, strong) NSArray *elementsToParse;
@property (nonatomic, readwrite) BOOL storingCharacterData;
@end

enter image description here

3 个答案:

答案 0 :(得分:2)

你可以自动释放:

if ([elementName isEqualToString:kEntryStr]) {
    self.workingEntry = [[[AppRecord] new] autorelease];
}

或简单地发布:

if ([elementName isEqualToString:kEntryStr]) {
    self.workingEntry = [[AppRecord] new];
    [self.workingEntry release];
}

顺便说一句,new与alloc + init相同。

答案 1 :(得分:0)

由于ARC已禁用,因此您需要在创建AppRecord实例时自动释放它。

self.workingEntry = [[[AppRecord alloc] init] autorelease];

答案 2 :(得分:0)

首先,它不是保留圈,只是内存泄漏。

泄漏

在你的情况下,workEntry是强大的属性。这意味着,workingEntry的setter就像:

- (void)setWorkingEntry:(AppRecord *)workingEntry {
    if (workingEntry != _workingEntry){
        [_workingEntry release];
        _workingEntry = [workingEntry retain];
    }
}

正如你在setWorkingEntry之后看到的那样:属性将具有至少为1的retainCounter,这将通过[_workingEntry release]在dealloc中减少;并且在正常情况下,保留计数器应为0以释放该实例,但在您的情况下,您设置[[AppRecord alloc] init](也有+1保留计数器)。所以在这种情况下,在dealloc中你将使用_workingEntry和retain counter = 2,在你释放后,retain计数器将变为= 1并且永远不会被释放。因此在设置之后释放以使保持计数器标准化:

if ([elementName isEqualToString:kEntryStr]) {
    self.workingEntry = [[AppRecord] new]; // or [[AppRecord alloc] init]
    [self.workingEntry release];
}

保留圈

当两个(或更多)对象彼此具有强引用,并且例如在该类的deallocs中释放链接时,会发生保留循环。在这种情况下,它们永远不会被释放,因为在任何时候都会有至少一个强大的链接(来自其他对象,也无法释放)。