когда я выпускаю NSMutableArray, который я выделяю и инициирую, мой код ломается - PullRequest
1 голос
/ 20 октября 2011

с этим кодом, я хочу добавить изображение в том месте, где пользователь нажимает. Я хочу добавить новый для каждого крана.

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

, а затем @synthesize testPointArray в файле .m.

1 Ответ

3 голосов
/ 20 октября 2011

Ваш testPointArray не присваивает собственности, это обычный ивар. Делая линию

testPointArray = tempTestPointArray;

Утечка того, что было ранее в testPointArray. Объявите testPointArray как сохраняемое свойство и измените на.

self.testPointArray = tempTestPointArray;

Тогда держите [tempTestPointArray release];

EDIT:

Так что причина, по которой этот код не работает, связана с магией свойств. Следующий код эквивалентен.

self.testPointArray = tempTestPointArray;
[self setTestPointArray:tempTestPointArray];

Когда вы делаете @sythesize testPointArray;, он генерирует метод установки, подобный этому:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...