随着内存堆空间的增加,类别实现陷入线程

时间:2015-02-26 06:38:28

标签: objective-c heap-memory

我正在学习Objective-C中的类别。我试图在XCode中编写一个带有类别的示例程序,程序执行挂起在一行,如图所示,但内存不断增加。我在下面附上快照。

Memory map keeps increasing

源代码如下:

A] fraction.h

#import <Foundation/Foundation.h>

@interface Fraction:NSObject

@property (nonatomic) int numerator;

@property (nonatomic) int denominator;

-(void) setTo:(int) numerator over:(int) denominator;

-(void) reduce;

-(double) convertToNum;

-(void) print;

@end

B] fraction.m

#import <Foundation/Foundation.h>
#import "Fraction.h"

@implementation Fraction
-(void) setTo:(int) n over:(int) d {
    _numerator = n;
    _denominator = d;
}

-(void) print {
    NSLog(@"The resultant  value is %d/%d", [self numerator], [self denominator]);
}

-(double) convertToNum {
    return
        ((double)[self numerator]/(double)[self denominator]);
}

-(void) reduce {
    int temporaryNumerator = [self numerator];
    int temporaryDenominator = [self denominator];
    while (temporaryDenominator != 0) {
        int remainder = temporaryNumerator % temporaryDenominator;
        temporaryNumerator = temporaryDenominator;
        temporaryDenominator = remainder;
    }
    _numerator /= temporaryNumerator;
    _denominator /= temporaryNumerator;
}

@end

C]分数+ MathOps.h

#import "Fraction.h"

@interface Fraction (MathOps)

-(Fraction*) add:(Fraction*) input;
-(Fraction*) mul:(Fraction*) input;
-(Fraction*) sub:(Fraction*) input;
-(Fraction*) div:(Fraction*) input;
@end

D]分数+ MathOps.m

#import "Fraction.h"
#import "Fraction+MathOps.h"

@implementation Fraction (MathOps)

-(Fraction*) add:(Fraction*) input {
    Fraction* result = [[Fraction init] alloc];
    [result setTo:
        (([self numerator] * [input denominator]) +
         ([input numerator] * [self denominator])) over:([self denominator] * input.denominator)];
    return result;
}

-(Fraction*) mul:(Fraction *)input {
    Fraction* result = [[Fraction alloc] init];
    result.numerator =
    ([self numerator] * [input denominator]);
    result.denominator =
        ([self denominator] * [input denominator]);
    return result;
}

-(Fraction*) sub:(Fraction *)input {
    Fraction* result = [[Fraction alloc] init];
    result.numerator = ([self numerator] * [input denominator]) - (input.numerator * [self denominator]);
    result.denominator = [self denominator] * [input denominator];
    return result;
}

-(Fraction*) div: (Fraction*) input {
    Fraction *result = [[Fraction alloc] init];
    result.numerator =
        [self numerator] * [input denominator];
    result.denominator = [self denominator] * [input denominator];
    return result;
}
@end

E] main.m

#import <Foundation/Foundation.h>
#import "Fraction.h"
#import "Fraction+MathOps.h"

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        // insert code here...
        NSLog(@"Hello, World From Categories, Protocols, Extensions and Delegations");
        Fraction * fractionOne =
            [[Fraction alloc] init];
        [fractionOne setTo:15 over:10];
        [fractionOne print];
        NSLog(@"The  double value is %g", [fractionOne convertToNum]);
        [fractionOne reduce];
        //[fractionOne  print];

        /**
         Fraction Two.
         */
        Fraction* fractionTwo = [[Fraction alloc] init];
        [fractionTwo setTo:5 over:2];
        //[fractionTwo print];
        // Testing catetories.
        Fraction* addThree = [fractionOne add:fractionTwo];
        [addThree print];
    }
    return 0;
}

1 个答案:

答案 0 :(得分:1)

您正在调用[[Fraction init] alloc],这是向后的。

您还应该避免在setTo方法中直接访问iVar,因为它不是访问方法。

这也不是“挂起”。程序抛出异常会导致崩溃。调试器已暂停执行。