对象的潜在泄漏,即使在 ARC 中?

Posted

技术标签:

【中文标题】对象的潜在泄漏,即使在 ARC 中?【英文标题】:Potential leak of an object, even in ARC? 【发布时间】:2012-11-05 10:49:31 【问题描述】:

我正在使用以下代码并且正在使用 ARC

NSString *text;
static NSString *CellIdentifier=@"Cell";
FeedsCell *cell= [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil)

    cell = [[FeedsCell alloc] initWithStyle:UITableViewCellStyleSubtitle  reuseIdentifier:CellIdentifier];


if (indexPath.row == [feedsData count]-1)

    [spinner startAnimating];
    [spinner setHidesWhenStopped:YES];

    OnDemand_fetch *getData = [[OnDemand_fetch alloc] init];

    if(nextUrl != NULL)
    

        NSString *nextfbUrl = [getData getnextFbfeedUrl];
        NSString *nexturlEdited = [nextfbUrl stringByReplacingOccurrencesOfString:@"|" withString:@"%7C"];
        [demandfetch getFeedsInBackground:nexturlEdited];



    
    else
    
        [spinner stopAnimating];
        self.myTableView.tableFooterView=nil;
        

在分析时,显示警告: “在第 267 行分配并存储到 'getData' 中的对象的潜在泄漏。”

谁能建议避免这种情况的方法?这会造成什么麻烦吗?

谢谢

【问题讨论】:

你确定是 ARC 吗?这对我来说看起来不错。 getData 是否在其他地方使用过? 是的..我确定,我不会在其他任何地方使用 getData 对象。 OnDemand_fetch *getData = [[OnDemand_fetch alloc] init]; 更改为OnDemand_fetch *getData = [[[OnDemand_fetch alloc] init] autorelease];。这会在构建时带来任何错误吗? 没有错误!但我正在使用 ARC!为什么会有这种奇怪的行为? 如果编译器允许你使用autorelease,那么你就没有使用ARC。 ARC 禁止调用 autorelease。 【参考方案1】:

没有错误!但我正在使用 ARC!为什么会有这种奇怪的行为?

因为...您没有使用 ARC。不知道为什么你认为你是。要转换为 ARC,请转到 Edit->Refactor->Convert to Objective-C ARC。

如果你不想全力以赴,ARC 一切,你可以将-fobjc-arc 作为编译器标志添加到你想使用 ARC 的文件中,项目不是 ARC。

【讨论】:

注意:您需要将项目中的每个目标单独转换为 ARC!我自己遇到了这个,以为我已经转换为 ARC,但没有。要检查:项目 -> 目标 -> 构建设置,查看 CLANG_ENABLE_OBJC_ARC 是否设置为是。 (使用过滤框搜索“arc”)【参考方案2】:

您只在if(nextUrl != NULL) 块内使用getData 对象,您可以尝试将其移动到该块并在末尾设置为nil,如下所示:

if(nextUrl != NULL)

    OnDemand_fetch *getData = [[OnDemand_fetch alloc] init];
    NSString *nextfbUrl = [getData getnextFbfeedUrl];
    NSString *nexturlEdited = [nextfbUrl stringByReplacingOccurrencesOfString:@"|" withString:@"%7C"];
    [demandfetch getFeedsInBackground:nexturlEdited];
    getData = nil;

【讨论】:

如果他真的在使用 ARC,则不需要这样做。 ARC 会识别对象何时超出范围并释放它。 完全同意,我认为问题在于他没有在这个特定文件中使用 ARC

以上是关于对象的潜在泄漏,即使在 ARC 中?的主要内容,如果未能解决你的问题,请参考以下文章

ABMultiValueCopyArrayOfAllValues 对象的潜在泄漏

ARC圆形保留检测

想知道我是不是有内存泄漏(报告为潜在)

突然“物体的潜在泄漏”

内存泄漏和僵尸有啥区别?

使用 ARC 查找对象的保留位置