2

我在尝试使用 facebook-ios-sdk 修复内存泄漏时遇到了这个问题。将对象从没有弧编译的类传递到启用弧的类时,我该如何处理这种情况?

这是非弧编译 Facebook 库中的代码:(我删除了与问题无关的不必要的东西)如您所见,结果对象没有自动释放或释放。

- (void)handleResponseData:(NSData *)data {        
    NSError* error = nil;
    id result = [self parseJsonResponse:data error:&error];
    self.error = error;

    // Call the defined delegate wich is my AppDelegate didLoad method wich is arc enabled
    [_delegate request:self didLoad:result];
}

- (id)parseJsonResponse:(NSData *)data error:(NSError **)error {
    SBJSON *jsonParser = [[SBJSON alloc] init];

    //gets the object wich leaks or gets overreleased
    id result = [jsonParser objectWithString:responseString];
    [jsonParser release];

    return result;
}

现在,如果我尝试将 autorelease 添加到结果对象,当我的 AppDelegate 中的 arc 代码尝试释放对象时,我将面临 NSZombie。但是,如果我留下这样的代码,我将面临内存泄漏,结果对象没有被释放。

我错过了一些基本的东西吗?我无法理解这个?

感谢您的任何建议!克里斯

4

1 回答 1

2

result返回的 from已经-parseJsonResponse:... 自动释放(参见底部的注释)。

由于-parseJson方法的名称不是以 new、alloc、copy 或 mutableCopy 开头,因此编译器假定它返回一个引用计数为 +0 的对象,这意味着如果要保留它,则需要由调用代码保留它周围,​​如果没有被保留,则不需要释放这是一种冗长的说法,即它既不应该泄漏也不应该导致你的 ARC 代码崩溃,正如你在问题中所写的那样。

在 ARC 代码和手动引用计数代码之间传递对象不需要任何特殊处理。您只需要确保方法的名称与它们在非 ARC 代码中的内存管理语义相匹配。在这种情况下,您似乎确实做到了,尽管正如您所说,您没有发布完整的代码。

注意:大概会objectWithString:返回一个自动释放的对象。如果不是,它应该(因为它不以 alloc、new、copy、mutableCopy 开头)。

于 2012-05-18T14:54:47.027 回答