将对象从无弧编译类传递给启用弧的类?

时间:2012-05-18 14:47:48

标签: objective-c

我试图用facebook-ios-sdk修复内存泄漏时遇到了这个问题。将对象从无弧编译的classe传递给arc enabled classe?

时,如何处理这种情况

这是非弧编译的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;
}

现在,如果我尝试将自动释放添加到结果对象中,当我的AppDelegate中的弧形代码尝试释放对象时,我正面临一个NSZombie。但是,如果我像这样离开代码,那么我面临的内存泄漏就会导致结果对象无法释放。

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

Thanx任何建议!克里斯

1 个答案:

答案 0 :(得分:2)

result 返回的-parseJsonResponse:...已经自动释放(请参见下方的注释)。

由于-parseJson方法的名称不以new,alloc,copy或mutableCopy开头,因此编译器假定它返回一个具有+0引用计数的对象,这意味着它需要由调用代码,如果要保留,并且需要被释放,如果它没有被保留。这是一个冗长的说法,它既不会泄漏也不会导致您的ARC代码崩溃,如您的问题中所述。

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

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