#1
  1. No Profile Picture
    Registered User
    Devshed Newbie (0 - 499 posts)

    Join Date
    Jan 2008
    Location
    Alberta
    Posts
    6
    Rep Power
    0

    Objective-C - Understanding "release"


    I've bolded the part of the code I don't fully understand.

    • Won't sum = sum2 just overwrite the old sum? So why do you need to release it beforehand?
    • Why isn't sum2 released at the end of the program? Should it be?


    Code:
    #import “Fraction.h”
    
    int main (int argc, 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]; // set 1st fraction to 0
    
    NSLog (@”Enter 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]; // release previous sum
         sum = sum2;
         pow2 *= 2;
    }
    
    NSLog (@”After %i iterations, the sum is %g”, n, [sum convertToNum]); [aFraction release];
    [sum release];
    [pool drain];
    
    return 0;
    }
  2. #2
  3. No Profile Picture
    Registered User
    Devshed Newbie (0 - 499 posts)

    Join Date
    Jan 2008
    Location
    Alberta
    Posts
    6
    Rep Power
    0
    Bump.
  4. #3
  5. No Profile Picture
    Contributing User
    Devshed Novice (500 - 999 posts)

    Join Date
    May 2007
    Posts
    765
    Rep Power
    929
    You'll probably get more/better answers in the C forum.

    I don't know Objective-C, but (assuming alloc/release == new/delete) it sounds like you're confusing references with values. "sum" and "sum2" aren't actual Fraction objects, but are just the address of Fraction objects. So "sum = sum2" only makes "sum" and "sum2" refer to the same Fraction object. The one "sum" originally referenced would still be out there in memory (hence the release). You don't need to release "sum2" at the end of the program since after the loop ends both "sum" and "sum2" refer to the same Fraction object, calling release using "sum2" would be an error since the Fraction object it refers to was already released when you called release using "sum".
    sub{*{$::{$_}}{CODE}==$_[0]&& print for(%:: )}->(\&Meh);
  6. #4
  7. Contributing User
    Devshed Newbie (0 - 499 posts)

    Join Date
    Jan 2010
    Location
    Katy, Texas
    Posts
    495
    Rep Power
    199
    Originally Posted by thomashw
    I've bolded the part of the code I don't fully understand.

    • Won't sum = sum2 just overwrite the old sum? So why do you need to release it beforehand?
    • Why isn't sum2 released at the end of the program? Should it be?


    Code:
    #import “Fraction.h”
    
    int main (int argc, 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]; // set 1st fraction to 0
    
    NSLog (@”Enter 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]; // release previous sum
         sum = sum2;
         pow2 *= 2;
    }
    
    NSLog (@”After %i iterations, the sum is %g”, n, [sum convertToNum]); [aFraction release];
    [sum release];
    [pool drain];
    
    return 0;
    }
    Since sum and sum2 are both pointers to instances of Fractions, all
    Code:
    sum = sum2 ;
    will do is overwrite the pointer contained in sum, thus causing a memory leak to the instance that sum used to point to. You need to release it before the assignment of sum2. Remember, the setTo method in Fraction.h will return a pointer to a new instance of Fraction.

    sum2 could have been released at the end of the program, as both sum and sum2 point to the same instance.

IMN logo majestic logo threadwatch logo seochat tools logo