0

我有一个看起来像社交网络 iOS 应用的示例应用。我是可可框架的新手,所以我正在研究示例代码。点击分析后,应用程序中报告了 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 对象

2) 对象泄露:分配的对象在此执行路径后面没有被引用,并且保留计数为+1

我在上面的代码中提到了我收到这些泄漏的确切位置。谁能告诉我这是什么原因造成的?

4

3 回答 3

1

您必须放弃您拥有的对象的所有权

id obj =  [item copy];
[SignIn addObject:obj]; // SignIn will retain obj 
[obj release];  

看看内存管理编程指南

        item = [[NSMutableDictionary alloc] init]; // release this object
        currentUserId = [[NSMutableString alloc] init]; // release this object

        currentError = [[NSMutableString alloc] init]; // release this object
于 2012-10-25T18:41:59.093 回答
0

每个 alloc、retain、copy 调用都应该有等效的 release 调用。当您在 didStartElement 中分配项目、currentUserId 和 currentError 时。它们应该在某个地方发布,根据您的代码,它将主要在 didEndElement 中:

请记住,只要将对象添加到数组或字典中,就会保留这些对象。只要数组(或)字典被释放,这些对象就会被释放。

id obj = [项目副本];// obj 保留计数 +1

[登录添加对象:obj];// obj 保留计数 +1

[对象释放];// obj 保留计数-1

每当 SignIn 被释放时,obj retain count 将变为 0。

于 2012-10-25T18:59:16.600 回答
0

还有一些与内存泄漏有关的观点。应遵循以下规则以避免内存泄漏:

您拥有您创建的任何对象

您使用名称以“alloc”、“new”、“copy”或“mutableCopy”开头的方法创建对象(例如,alloc、newObject 或 mutableCopy)。

您可以使用保留来获取对象的所有权

接收到的对象通常保证在接收它的方法中保持有效,并且该方法也可以安全地将对象返回给它的调用者。你在两种情况下使用retain:(1)在访问器方法或init方法的实现中,获取你想要存储的对象的所有权作为属性值;(2) 防止对象因某些其他操作的副作用而失效

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

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

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

参考:苹果文档

于 2012-10-25T19:17:04.427 回答