[ios]怎样阻止 Xcode 静态分析器从报告对象泄露?

标签: Xcode ios
发布时间: 2017/3/28 23:16:30
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

这是我上我的课 XXObject 的方法

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

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

详细信息说"3。泄露的对象︰ 对象分配和存储到 '对象' 从方法返回的名称 ('objectWithValuesFromXml:') 开头 '复制',不是 ' mutableCopy '分配' 或 '新'。这违反命名约定......"

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

+ (id)typeRemainderOfMethodName

类型常常是类名前缀和 RemainderOfMethodName 减去从开始或从。

我可以做什么?

解决方法 1:

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

你引用的文档也是正确的工厂方法往往遵循此命名约定。但他们不返回 + 1 对象。他们返回 autorelease 对象。Autorelease 对象是那些将被释放时的 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 中的方法声明和参考 self 当您调用 alloc :

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

这可以确保︰ 如果此类过创建子类,此方法将继续为子类,太工作。

赞助商