复制对象时,客观内存泄漏

时间:2012-10-25 18:18:23

标签: ios objective-c memory-leaks

我有一个看起来像社交网络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

我在上面的代码中已经提到了我收到这些泄漏的确切内容。任何人都可以告诉我是什么原因引起的吗?

3 个答案:

答案 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)防止对象因某些其他操作的副作用而失效

当您不再需要它时,您必须放弃您拥有的对象的所有权

您通过向对象发送释放消息或自动释放消息来放弃对象的所有权。

您不得放弃您不拥有的对象的所有权

参考:apple documents