Xcode中的NSNumber问题

时间:2011-05-26 17:43:08

标签: objective-c xcode

我正在尝试为iPad制作猜谜游戏,我正在使用NSNumber来跟踪用户在游戏中留下的尝试次数,称为numberOfTries。 NSNumber位于基于视图的文件中,我首先在drawRect方法中初始化它,以便绘制表示用户剩余尝试次数的框。我在int值为5时初始化数字,并且它在那时工作,但是当我尝试在类中的另一个方法中使用它时,如表示用户是否没有尝试,它表明它已经在当我输入第一个猜测时为零。这是代码:

//Game.h
#import <UIKit/UIKit.h>


@interface Game : UIView {
    NSString* equation;
    NSNumber* numberOfTries;
}

@property(nonatomic, retain)NSString* equation;
@property(nonatomic, retain)NSNumber* numberOfTries;

@end


//Game.m
#import "Game.h"


@implementation Game

@synthesize equation, numberOfTries;

- (id)initWithFrame:(CGRect)frame {

    self = [super initWithFrame:frame];
    if (self) {
    }
    return self;
}

-(BOOL)hasLost
{
    int tryNumber = [self.numberOfTries intValue];
    return tryNumber <= 0;
}

-(BOOL)guessWithEquation:(NSString*)guessEquation
{
    int tryNumber = [self.numberOfTries intValue];
    if ([self.equation isEqualToString:guessEquation]) {return YES;}
    tryNumber--;
    self.numberOfTries = [NSNumber numberWithInt:tryNumber];
    return NO;
}

-(void)setEquationTo:(NSString*)theEquation {self.equation = [[NSString alloc] initWithString:theEquation];}

- (void)drawRect:(CGRect)rect {
    self.numberOfTries = [[NSNumber alloc] initWithInt:5];
    int halfwidth = self.bounds.size.width/2;
    int halfheight = self.bounds.size.height/2;
    int threeqw = self.bounds.size.width-(self.bounds.size.width/4);
    int threeqh = self.bounds.size.height-(self.bounds.size.height/4);
    int oneqw = self.bounds.size.width/4;
    int oneqh = self.bounds.size.height/4;

    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSetLineWidth(context, 2.0);
    CGColorSpaceRef colorspace = CGColorSpaceCreateDeviceRGB();
    CGFloat components[] = {0.0, 0.0, 0.0, 1.0};
    CGColorRef color = CGColorCreate(colorspace, components);
    CGContextSetStrokeColorWithColor(context, color);

    int tryNumber = [self.numberOfTries intValue];
    int point = oneqw-100;
    while (tryNumber > 0) {
        CGContextMoveToPoint(context, point, threeqh);
        CGContextAddLineToPoint(context, point+15, threeqh);
        CGContextAddLineToPoint(context, point+15, threeqh+15);
        CGContextAddLineToPoint(context, point, threeqh+15);
        CGContextAddLineToPoint(context, point, threeqh);
        tryNumber--;
        point += 30;
    }

    CGContextStrokePath(context);
    CGColorSpaceRelease(colorspace);
    CGColorRelease(color);
}

- (void)dealloc {
    [super dealloc];
}


@end

当它调用guessWithEquation时,numberOfTries已经为0,这实在令人困惑。我在这里缺少什么?

1 个答案:

答案 0 :(得分:0)

你从numberOfTries未初始化开始,因此(因为它是一个实例变量,这就是Objective-C的工作方式)nil。然后,每次重绘时,都会将numberOfTries初始化为值为5的新NSNumber。然后你会抛出一个虚假的retain以获得良好的衡量标准。你怎么期望这样结束呢?

在您开始时初始化,可能在initWithFrame,但如果视图是从IB资源文件加载的,您可能还需要考虑awakeFromNib。从那时起,在值发生变化时替换该值,但不要没有充分理由重新创建该对象。

FFS永远不会永远不会这样做:[self.something retain]。您认为这是做什么的?该属性已定义为retain。相信那个。这种事情只是弄得一团糟。