如何阻止Xcode静态分析器报告对象泄漏?

时间:2014-11-21 10:51:21

标签: ios xcode memory-leaks

这是我的XXObject类的方法

+ (XXObject*)objectWithValuesFromFromXml:(struct _TBXMLElement *)element
{
    XXObject *object = [[XXObject alloc] init];
    ...
    return object;
}

XCode说Potential leak of an object stored in 'object'

细节说明" 3。对象泄露:对象分配并存储到'对象'从一个方法返回,该方法的名称(' objectWithValuesFromXml:')不以' copy',' mutableCopy,' alloc'开头。或者' new'。这违反了命名惯例......"

但是文档()说"工厂方法的名称具有以下初始形式:

+ (id)typeRemainderOfMethodName

其中type是类名减去前缀,而RemainderOfMethodName通常以With或From开头。"

我该怎么办?

1 个答案:

答案 0 :(得分:5)

您正在返回+1对象。只有以copymutableCopyallocnew开头的方法才能返回+1对象。这个静态分析仪警告是正确的。

您引用的文档也是正确的,工厂方法通常遵循该命名约定。但他们不会返回+1对象。他们返回autorelease个对象。自动释放对象是在自动释放池耗尽时将释放的对象(通常是当您回退到应用程序运行循环时)。但是通过返回自动释放对象,调用者有机会retain该对象,并将其用于自己的目的。

顺便说一下,您可以通过在方法声明中显式指定NS_RETURNS_RETAINED来抑制此警告,该声明用于通知编译器您的方法不符合命名约定。但这是不可取的。此NS_RETURNS_RETAINED仅应用于现有方法不符合既定命名约定但由于某种原因无法更改的情况(例如,已使用的API并更改内存语义)会打破现有的代码。)

我建议您:

  • 重命名此例程:

    + (XXObject*)newObjectWithValuesFromFromXml:(struct _TBXMLElement *)element
    {
        XXObject *object = [[XXObject alloc] init];
        ...
        return object;
    }
    
  • 返回autorelease对象:

    + (XXObject*)objectWithValuesFromFromXml:(struct _TBXMLElement *)element
    {
        XXObject *object = [[[XXObject alloc] init] autorelease];
        ...
        return object;
    }
    

另外,您通常不会在此方法声明中引用您的类,例如,您可以在方法声明中使用instancetype,并在调用{{1}时引用self }:

alloc

这确保了如果这个类被子类化,那么这个方法也将继续为子类工作。