我有一个看起来像社交网络iOS应用的示例应用。我是cocoa框架的新手,所以我正在研究示例代码。点击分析后,应用程序中有255个报告的内存泄漏。我能够解决大约100个非常简单的漏洞,但我无法解决其余问题。
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict{
//DLog(@"found this element: %@", elementName);
currentElement = [elementName copy];
if([MethodName isEqualToString:@"SignInStep"])
{
if ([elementName isEqualToString:@"item"])
{ // clear out our story item caches...
item = [[NSMutableDictionary alloc] init];
currentUserId = [[NSMutableString alloc] init];
currentError = [[NSMutableString alloc] init];
}
}
}
项目变量的分配:
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{
//DLog(@"ended element: %@", elementName);
if([MethodName isEqualToString:@"SignInStep"])
{
if ([elementName isEqualToString:@"item"])
{ // save values to an item, then store that item into the array...
[item setObject:currentUserId forKey:@"userId"];
[item setObject:currentError forKey:@"error"];
[SignIn addObject:[item copy]]; //Method returns Objective C Object with +1 retain count
}
}
}//Object leaked: allocated object is not referenced later in this execution path and has a retain count of +1
我收到了以下错误:
1)方法返回具有+1保留计数的Objective C Object
2)对象泄漏:此执行路径中未引用已分配的对象,并且保留计数为+1
我在上面的代码中已经提到了我收到这些泄漏的确切内容。任何人都可以告诉我是什么原因引起的吗?
答案 0 :(得分:1)
您必须放弃您拥有的对象的所有权
id obj = [item copy];
[SignIn addObject:obj]; // SignIn will retain obj
[obj release];
查看Memory Management Programming Guide
item = [[NSMutableDictionary alloc] init]; // release this object
currentUserId = [[NSMutableString alloc] init]; // release this object
currentError = [[NSMutableString alloc] init]; // release this object
答案 1 :(得分:0)
每个alloc,retain,copy调用都应该有相同的释放调用。 在didStartElement中分配item,currentUserId和currentError时。它们应该在某些地方发布,根据你的代码,它将主要在didEndElement:
请记住,无论何时将对象添加到数组或字典中,都将保留对象。只要释放了数组(或)字典,就会释放这些对象。
id obj = [item copy]; // obj retaincount +1
[SignIn addObject:obj]; // obj retaincount +1
[obj release]; // obj retaincount-1
每当释放SignIn时,obj保留计数将变为0。
答案 2 :(得分:0)
还有一些与内存泄漏有关的问题。 应遵循这些规则以避免内存泄漏:
您拥有自己创建的任何对象
使用名称以“alloc”,“new”,“copy”或“mutableCopy”开头的方法(例如,alloc,newObject或mutableCopy)创建对象。
您可以使用保留
取得对象的所有权通常保证收到的对象在接收到的方法中保持有效,并且该方法也可以安全地将对象返回给其调用者。在两种情况下使用retain:(1)在accessor方法或init方法的实现中,获取要存储为对象属性的对象的所有权; (2)防止对象因某些其他操作的副作用而失效
当您不再需要它时,您必须放弃您拥有的对象的所有权
您通过向对象发送释放消息或自动释放消息来放弃对象的所有权。
您不得放弃您不拥有的对象的所有权