【问题标题】:passing objects from no arc compiled class to arc enabled class?将对象从无弧编译类传递到弧启用类?
【发布时间】:2012-05-18 14:47:47
【问题描述】:

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

这是非 arc 编译的 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 中的 arc 代码尝试释放对象时,我将面临 NSZombie。但是,如果我留下这样的代码,我将面临内存泄漏,结果对象不会被释放。

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

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

【问题讨论】:

    标签: objective-c


    【解决方案1】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-06
      • 1970-01-01
      • 1970-01-01
      • 2014-04-03
      • 2011-05-27
      相关资源
      最近更新 更多