C返回自动发行副本

我遇到了一个奇怪的问题,试图理解Apple的内存管理标准。 比方说,我有一个方法返回一个副本,而不让用户知道它是一个副本。

+(Point2D*) Add:(Point2D*)a To:(Point2D*)b
{
        Point2D * newPoint = [a copy];
        [newPoint Add:b]; // Actually perform the arithmetic.
        return [newPoint autorelease];
}

问题在于Xcode的Analyze函数将此标记为发送太多的对象 - 自动调用。 我假设这是因为-copy隐含地假设你正在获得所有权,因此可能有+0保留计数的可能性。 但我不完全确定。

Xcode的分析信息

+(Point2D*) Add:(Point2D*)a To:(Point2D*)b
{
        Point2D * newPoint = [a copy]; // <- 1. Method returns an Objective-C object with a +0 retain count.
        [newPoint Add:b];
        return [newPoint autorelease]; // <- 2. Object sent -autorelease method.
                                       // <- 3. Object returned to caller with a +0 retain count.
                                       // <- 4. Object over -autoreleased: object was sent -autorelease but the object has zero (locally visible) retain counts.
}

任何提示或提示为什么会发生这种情况? 除非我遗漏了一些东西,否则代码应该可以正常工作,因为autorelease不会触发,直到安全时间(例如,它的工作类似于便利的构造函数,用户有时间保留)。

根据请求,-copyWithZone:将按如下方式实现:

-(id)copyWithZone:(NSZone *)zone
{
        return [[Point2D allocWithZone:zone] initX:x Y:y Z:z];
}

在您的Point类中正确地执行-copyWithZone:(NSZone*)zone (或者至少请复制它在这里)

链接地址: http://www.djcxy.com/p/53279.html

上一篇: C Returning Autoreleased Copies

下一篇: When will a autorelease get released