【问题标题】:How do I stop Xcode static analyser from reporting object leak?如何阻止 Xcode 静态分析报告对象泄漏?
【发布时间】:2014-11-21 10:51:21
【问题描述】:

这是我在我的类 XXObject 上的方法

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

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

详细信息说“3. 对象泄漏:分配并存储到 'object' 中的对象是从名称 ('objectWithValuesFromXml:') 不以 'copy'、'mutableCopy、'alloc' 或 'new 开头的方法返回的'。这违反了命名约定……”

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

+ (id)typeRemainderOfMethodName

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

我能做什么?

【问题讨论】:

  • 调用方法xXObjectWithValuesFromFromXml? “减去前缀”究竟是什么意思?
  • 您使用的是 ARC 还是 MRC?
  • 我没有使用 ARC。什么是 MRC?
  • 手动引用计数。有时也称为 MRR(手动保留和释放)。
  • 不,autorelease 将在自动释放池耗尽时释放对象(即您返回到运行循环)。但是调用此方法的任何人都可以安全地保留此对象并将其用于自己的目的。

标签: ios xcode memory-leaks


【解决方案1】:

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

您引用的文档也是正确的,工厂方法通常遵循该命名约定。但它们不返回 +1 对象。他们返回 autorelease 对象。自动释放对象是在自动释放池耗尽时将被释放的对象(通常是当您返回到应用程序运行循环时)。但是通过返回 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,而在调用alloc时引用self

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

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

【讨论】:

    猜你喜欢
    • 2012-02-05
    • 1970-01-01
    • 2021-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-11
    • 2011-03-09
    相关资源
    最近更新 更多