#import "Fraction.h"int main( int argc,const char *argv[])
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

Fraction * aFraction = [[Fraction alloc] init];

Fraction *sum = [[Fraction alloc] init],*sum2;


int i , n, pow2;


[sum setTo: 0 over:1];

NSLog(@"En ter your value for n:");
scanf("%i",&n);

pow2 = 2;
for(i = 1;  i <= n;  ++i)
{
[aFraction setTo:1 over:pow2];
sum2 = [sum add:aFraction];
[sum release];
sum = sum2;
pow2 *= 2;

}

NSLog(@"After %i iterations,the sum is %g", n, [sum convertToNum]);
[aFraction release];
[sum release];
[pool drain];
return 0;
}这样运行正常,但是我不明白,为什么sum2不用release.在后边加个release 就错了〜

解决方案 »

  1.   

    iOS的默认规则是,内存谁分配谁释放,sum2你并没有分配内存,就没有必要release。如果add函数中分配了内存,那么add函数自己需要释放。如果返回的对象是需要释放的,add函数会调用autorelease,并不立即释放,而是当你使用完毕之后,在程序的当前这次消息循环结束时真正释放。
      

  2.   

    ls说的很好。内存管理其中要遵循的一个原则就是“谁分配谁释放”
    其中[sum add:aFraction] 给sum发送一个add的消息,而这个add函数内部会调用autorelease,由NSAutoreleasePool 来管理,并不立即释放,而是当你使用完毕之后,在程序的当前这次消息循环结束时真正释放。
      

  3.   

    注意:用自动释放池释放时对象的release为零,不然是释放不掉的
      

  4.   

    sum2本身不具有retain属性,sum2 = [sum add:aFraction];这样并不能使得retainCount加1。由于sum和sum2指向同一块内存区域,当执行[sum release];之后,retainCount减到0;这时内存已经释放了。楼主的代码还有个问题就是[sum release];执行的次数和retain,alloc copy之类的执行次数之和不匹配,如果采用调试方式的化楼主的代码是会异常的。