首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >init方法和"Object with a +0 retain count returned to caller where where a +1 (owning) retain count is expected a+1(Owning)retain count“-假阳性?

init方法和"Object with a +0 retain count returned to caller where where a +1 (owning) retain count is expected a+1(Owning)retain count“-假阳性?
EN

Stack Overflow用户
提问于 2012-03-26 23:03:02
回答 2查看 826关注 0票数 1

首先:我理解为什么这个警告存在,我只是不能解释我自己,为什么它在这种情况下被触发。Cocoa的官方内存管理策略如下:“您拥有您创建的任何对象,您可以使用名称以”alloc“、”new“、”copy“或”mutableCopy“开头的方法(例如,alloc、newObject或mutableCopy)创建对象。

您可以使用retain获取对象的所有权“

我知道有这样的代码:

代码语言:javascript
复制
- (id) foo
{
    // do something
    return self;
}

- (id) init
{
    self = [super init];
    return [self foo]; // clang static analyzer is complaining about returning an object with a +0 retain count here, although a +1 would be expected
}

Afaik这是来自clang的假阳性,不是吗?我的意思是,唯一增加保留计数的方法是" retain“和所有名称以"alloc”、"new“、"copy”或"mutableCopy“开头的方法,所以"init”不会增加保留计数,而是传递给调用者,以传递类"alloc"-method的返回值,所以实际上"init“应该返回+0保留计数,而不是+1,不是吗?它只返回与传入的保留计数相同的对象。现在在该对象上调用"foo“也不会改变保留计数,所以这段代码应该是完全合法的,实际上它工作得很好,并且保留计数在程序的整个生命周期中都是正确的,只有静态分析器在抱怨。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-03-26 23:08:24

按照约定,方法名为foo意味着它返回调用者不拥有的对象。

alloc-init***组合返回调用者拥有的对象。

看起来分析器不能或者不会费心去查看foo内部,看看它实际在做什么,并且不知道返回的值与已经拥有的self是同一个对象。

这不是假阳性。如果子类或动态加载的类别覆盖foo以返回其他内容:

代码语言:javascript
复制
- (id) foo; {
    return [NSNumber numberWithInt:666];
}

那么你将会有一个self的泄漏和一个NSNumber对象的过度释放。

票数 4
EN

Stack Overflow用户

发布于 2012-03-26 23:09:04

是的,这是一个假阳性,但在设计类时,这是一个不好的做法。相反,您应该调用foo,然后返回self,如下所示:

代码语言:javascript
复制
-(id) init
{
    if ((self = [super init]))
    {
        [self foo];
    }

    return self;
}
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9874608

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档