Освобождение пути с помощью CGPathRelease, вызывающего BAD_ACCESS - PullRequest
1 голос
/ 03 декабря 2011

У меня есть свойство CGMutablePathRef в подклассе UIImageview.Когда я создаю новый путь и назначаю его свойству, CGPathRelease вызывает ошибку, когда я вызываю CGPathContainsPoint.Если я не освобождаю путь, код работает нормально, но есть утечка.Как правильно передать право собственности и освободить?

.h // UIImageView subclass
@property CGMutablePathRef pathHold;


.m
CGMutablePathRef myPath;
myPath = CGPathCreateMutable();
CGRect myRect2 = holderImageView.bounds;
float midX = CGRectGetMidX(myRect2);
float midY = CGRectGetMidY(myRect2);

CGAffineTransform t = 
CGAffineTransformConcat(
                        CGAffineTransformConcat(
                                                CGAffineTransformMakeTranslation(-midX, -midY), 
                                                     CGAffineTransformMakeScale(holderImageView.pathZone,holderImageView.pathZone)), 
                        CGAffineTransformMakeTranslation(midX, midY));
CGPathAddEllipseInRect(myPath, &t, myRect2);
CGPathCloseSubpath(myPath);

[holderImageView setPathHold:myPath];
CGPathRelease(myPath); // If path not released, works fine but leak.  
[self addSubview:holderImageView];
[holderImageView release];


.m
if(CGPathContainsPoint (self.pathHold, NULL, touchLocation, FALSE )) // This Causes error.

1 Ответ

0 голосов
/ 03 декабря 2011

Вы объявляете свою собственность без атрибута (сохранить). Это означает, что когда вы присваиваете путь к этому свойству, среда выполнения только присваивает указатель и не сохраняет ваш путь, поэтому, когда вы CGPathRelease () ссылаетесь на путь, он освобождается. Итак, вы должны объявить свойство в классе изображения заполнителя следующим образом:

@property (retain) id pathHold;

, а затем назначьте его следующим образом:

[holderImageView setPathHold:(id)myPath];

Обратите внимание, что в объявлении я использовал id как тип. Это связано с тем, что почти любой тип CoreGraphics и CoreFoundation на самом деле является допустимым объектом Objective-C, поэтому это преобразование (бесплатное мостовое соединение) можно выполнить, а приведение типа необходимо только для того, чтобы избежать предупреждений компилятора.

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