我正在学习Objective-C中的类别。我试图在XCode中编写一个带有类别的示例程序,程序执行挂起在一行,如图所示,但内存不断增加。我在下面附上快照。
源代码如下:
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;
}
答案 0 :(得分:1)
您正在调用[[Fraction init] alloc]
,这是向后的。
您还应该避免在setTo
方法中直接访问iVar,因为它不是访问方法。
这也不是“挂起”。程序抛出异常会导致崩溃。调试器已暂停执行。