我试图用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任何建议!克里斯
答案 0 :(得分:2)
result
返回的-parseJsonResponse:...
已经自动释放(请参见下方的注释)。
由于-parseJson
方法的名称不以new,alloc,copy或mutableCopy开头,因此编译器假定它返回一个具有+0引用计数的对象,这意味着它需要由调用代码,如果要保留,并且不需要被释放,如果它没有被保留。这是一个冗长的说法,它既不会泄漏也不会导致您的ARC代码崩溃,如您的问题中所述。
在ARC代码和手动引用计数代码之间传递对象不需要任何特殊处理。您只需要确保方法的名称与非ARC代码中的内存管理语义相匹配。在这种情况下,你似乎已经完成了这一点,尽管如你所说,你没有发布完整的代码。
注意:据推测,objectWithString:
会返回一个自动释放的对象。如果它不是它,它应该(因为它不以alloc,new,copy,mutableCopy开头)。