使用此代码,我想在用户点击的位置添加图像。我想为每个点击添加一个新的。
-(void) foundDoubleTap:(UITapGestureRecognizer *) recognizer
{
UIView *piece = recognizer.view;
CGPoint locationInView = [recognizer locationInView:piece];
UIImageView *testPoint = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"inner-circle.png"]];
testPoint.frame = CGRectMake(0, 0, 20, 20);
testPoint.center = CGPointMake(locationInView.x, locationInView.y);
[self.imageView addSubview:testPoint];
NSMutableArray *tempTestPointArray = [[NSMutableArray alloc] initWithArray:testPointArray];
[tempTestPointArray addObject:testPoint];
testPointArray = tempTestPointArray;
NSLog(@"testPointArray: %@", testPointArray);
CGRect myRect = CGRectMake((testPoint.center.x + 12), (testPoint.center.y + 12), 10, 10);
UILabel *myLabel = [[UILabel alloc] initWithFrame:myRect];
myLabel.text = [NSString stringWithFormat:@"Point %d", [testPointArray count]];
myLabel.font = [UIFont fontWithName:@"Trebuchet MS" size:10];
[myLabel sizeToFit];
[imageView addSubview:myLabel];
[myLabel release];
[testPoint release];
//[tempTestPointArray release];
}
为什么当我发布tempTestPointArray时,当我实现第二次点击时,我的代码会中断?它崩溃了:
NSMutableArray *tempTestPointArray = [[NSMutableArray alloc] initWithArray:testPointArray];
当我注释掉它的发布时,分析器不会将其标记为泄漏。规则发生了什么,如果你分配/初始化它,你必须释放它吗?
编辑:添加.h文件
.h文件:
@interface TestPointMapViewController : UIViewController <UIScrollViewDelegate, UITextFieldDelegate>
{
//other code
NSArray *testPointArray;
}
//other code
@property (nonatomic, retain) NSArray *testPointArray;
//other code
@end
然后在.m文件中@synthesize testPointArray。
答案 0 :(得分:3)
你的testPointArray
没有分配给一个属性,它是一个普通的ivar。做行
testPointArray = tempTestPointArray;
泄漏testPointArray
之前的内容。将testPointArray
声明为保留属性并更改为。
self.testPointArray = tempTestPointArray;
然后保留[tempTestPointArray release];
编辑:
因此,此代码失败的原因与属性的魔力有关。以下代码是等效的。
self.testPointArray = tempTestPointArray;
[self setTestPointArray:tempTestPointArray];
执行@sythesize testPointArray;
时,它会生成类似于此的setter方法:
- (void)setTestPointArray:(NSMutableArray *)array {
id temp = testPointArray;
testPointArray = [array retain];
[temp release];
}
因此,当您不使用属性表示法self.testPointArray
时,您没有正确保留变量。您也失去了对保留对象的引用,现在这是一个泄漏。
那有道理吗?如果没有,请查看此内容。