我正在尝试为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,这实在令人困惑。我在这里缺少什么?
答案 0 :(得分:0)
你从numberOfTries
未初始化开始,因此(因为它是一个实例变量,这就是Objective-C的工作方式)nil
。然后,每次重绘时,都会将numberOfTries
初始化为值为5的新NSNumber
。然后你会抛出一个虚假的retain
以获得良好的衡量标准。你怎么期望这样结束呢?
在您开始时初始化,可能在initWithFrame
,但如果视图是从IB资源文件加载的,您可能还需要考虑awakeFromNib
。从那时起,在值发生变化时替换该值,但不要没有充分理由重新创建该对象。
FFS永远不会永远不会这样做:[self.something retain]
。您认为这是做什么的?该属性已定义为retain
。相信那个。这种事情只是弄得一团糟。