如何解决此类内存泄漏问题?请帮忙。
@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
答案 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中释放链接时,会发生保留循环。在这种情况下,它们永远不会被释放,因为在任何时候都会有至少一个强大的链接(来自其他对象,也无法释放)。