除非值是硬编码的,否则错误的访问错误

时间:2012-03-13 20:40:10

标签: objective-c nsdictionary

我使用以下方法在NSDisctionary中设置键的值:

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {

NSLog(@"touchesEnded currentcolor: %@", currentColor);

if (currentTool == @"paint") {
NSLog(@"End Paint");
CGPoint point = [[touches anyObject] locationInView:self.view];
MaskPath * myNewPath = [mapView.drawthis containsPoint:point];
[myNewPath.attributes setValue:currentColor forKey:@"fill"];
[mapView setNeedsDisplay];

} else {
NSLog(@"End Pattern");

currentColor = @"1.png";

CGPoint point = [[touches anyObject] locationInView:self.view];
MaskPath * myNewPath = [mapView.drawthis containsPoint:point];
[myNewPath.attributes setValue:currentColor forKey:@"fill"];
[mapView setNeedsDisplay];
}
}

如果我尝试记录currentColor的值,那么应用程序会因为错误的访问而崩溃(第3行) 如果我使用Log out并使用硬编码值,一切正常。它也适用于if语句的第一部分。我已经检查了指定currentColor的函数,它正在提供正确的值。如果我在那时硬编码currentColor的值它可以正常工作。我运行了分析仪,没有内存泄漏或问题。我怎么能追踪这个问题?

1 个答案:

答案 0 :(得分:1)

一个明显的问题是您正在使用自动释放变量,如您的示例所示。很可能你在该方法之外做同样的事情。

我建议你让currentColor成为一个属性:

@property (nonatomic, retain) NSString *currentColor;

然后,要设置它,你会做这样的事情:

self.currentColor = @"SomeColor";

由于您使用retain声明了currentColor属性,因此在将其传递给NSLog时不会出现错误访问:

NSLog(@"This is my color: %@", self.currentColor);

如果你已经有了一个currentColor属性而你只是分配了ivar,那么你应该这样做:

currentColor = [NSString alloc] initWithString:@"Foo"];

总结一下:

1. self.currentColor = @"Foo"; //<-This is automagically retained
2. currentColor = [NSString alloc] initWithString:@"Foo"];  //<-Accessing the ivar directly, so you must ownify the string :D