当我发布我分配和启动的NSMutableArray时,我的代码中断了

时间:2011-10-20 19:38:11

标签: objective-c memory-management

使用此代码,我想在用户点击的位置添加图像。我想为每个点击添加一个新的。

-(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。

1 个答案:

答案 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时,您没有正确保留变量。您也失去了对保留对象的引用,现在这是一个泄漏。

那有道理吗?如果没有,请查看此内容。

http://developer.apple.com/library/mac/#documentation/cocoa/conceptual/objectiveC/Chapters/ocProperties.html#//apple_ref/doc/uid/TP30001163-CH17-SW1