【问题标题】:Object retain count对象保留计数
【发布时间】:2011-04-28 12:02:12
【问题描述】:

我分配了一个这样的对象:

PixelInfo *ob1=[[PixelInfo alloc]initWithName:clr :t];

那么object的retaincount就是1。

然后我就这样了......

[faceColor addObject:ob1];

然后retain count增加到2。为什么?

for(b=xi[i];b<=(xi[i+1]+1);b++)
        {   


            CGPoint t;
            t.x=b;
            t.y=y;

            UIColor *clr=nil;
            clr=[self getPixelColorAtLocation:loadImage.CGImage :t];    

             PixelInfo *ob=[[PixelInfo alloc]initWithName:clr :t];                    
             [faceColor addObject:ob];
             [ob release];
          }

这是我的代码。即使释放对象ob后,也会发生内存泄漏。为什么?

【问题讨论】:

标签: iphone memory-management memory-leaks retaincount


【解决方案1】:

所有集合(数组、字典、集合)在您执行操作时会增加对象的保留计数 [smth addObject: obj]

PS。 AddSubview 还增加了子视图的保留计数

【讨论】:

  • 并且每当发布消息发送到数组时,发布消息就会自动发送到其所有对象。
【解决方案2】:

我假设faceColor 是一个 NSMutableArray。当您将对象添加到 NSArray 或 NSDictionary 等容器时,容器会保留添加的对象。这是因为容器现在依赖于添加的对象,只要它在容器内,它就会继续存在。

【讨论】:

    【解决方案3】:

    在下面的语句中,您已经分配了对象,然后保留计数将增加 1,这就是您得到 1 的原因。

    PixelInfo *ob1=[[PixelInfo alloc]initWithName:clr :t];
    

    在下一个陈述中,我认为 faceColor 是NSMutableArray

    [faceColor addObject:ob1];
    

    您正在将对象 ob1 添加到数组中,因此如果您将对象添加到数组中,iOS 会将其保留计数增加 1,

    这就是原因,你有保留计数 2。

    已编辑:

    这是苹果所说的。

    重要提示:此方法在调试内存管理问题时通常没有价值。因为任何数量的框架对象可能已经保留了一个对象以保存对它的引用,而同时自动释放池可能在一个对象上保存了任何数量的延迟释放,所以您不太可能从中获得有用的信息方法。

    【讨论】:

    • 添加到数组后我想释放那个对象。为此我确实喜欢这个 [ob1 release];但是它的保留计数将变为 1,然后该对象将不会被释放,对吗?
    • 对:一旦你将它从数组中移除(或者你释放整个数组),它就会被释放。这是正常行为,您创建一个对象,添加到数组然后释放它。你这样做是因为你负责对象的内存管理,所以你创建然后释放对象,但是 NSArray 必须保留它以保持其内部一致性。
    • 不要将保留计数视为绝对数字。在 alloc/init 之后为 1 是PixelInfo 的实现细节。可能是5个或10个,没关系。把它想象成一个三角洲。每次你让它增加时,如果要释放对象,你必须让它减少。
    • @bbum : 是的,同意你的说法,但是上面的问题解释得非常直截了当,我们创建的对象,可能会被 iOS 保留,retainCount 可能会上升 5 或更多,跨度>
    • 感谢您的澄清。在教授许多新开发人员的过程中,我发现绝对保留计数在某种程度上是有效的,可以让开发人员在面临第一个现实世界的内存管理问题时花费数小时的非学习挫折感。
    猜你喜欢
    • 2011-07-21
    • 1970-01-01
    • 2010-10-08
    • 2017-08-26
    • 2020-04-22
    • 1970-01-01
    • 1970-01-01
    • 2014-12-09
    相关资源
    最近更新 更多