首先:我理解为什么这个警告存在,我只是不能解释我自己,为什么它在这种情况下被触发。Cocoa的官方内存管理策略如下:“您拥有您创建的任何对象,您可以使用名称以”alloc“、”new“、”copy“或”mutableCopy“开头的方法(例如,alloc、newObject或mutableCopy)创建对象。
您可以使用retain获取对象的所有权“
我知道有这样的代码:
- (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“也不会改变保留计数,所以这段代码应该是完全合法的,实际上它工作得很好,并且保留计数在程序的整个生命周期中都是正确的,只有静态分析器在抱怨。
发布于 2012-03-26 23:08:24
按照约定,方法名为foo意味着它返回调用者不拥有的对象。
alloc-init***组合返回调用者拥有的对象。
看起来分析器不能或者不会费心去查看foo内部,看看它实际在做什么,并且不知道返回的值与已经拥有的self是同一个对象。
这不是假阳性。如果子类或动态加载的类别覆盖foo以返回其他内容:
- (id) foo; {
return [NSNumber numberWithInt:666];
}那么你将会有一个self的泄漏和一个NSNumber对象的过度释放。
发布于 2012-03-26 23:09:04
是的,这是一个假阳性,但在设计类时,这是一个不好的做法。相反,您应该调用foo,然后返回self,如下所示:
-(id) init
{
if ((self = [super init]))
{
[self foo];
}
return self;
}https://stackoverflow.com/questions/9874608
复制相似问题