назначить свойства, объекты ARC и Core Foundation
Благодарякругозор это сейчас работает. И я даже думаю, что понимаю почему :-)
Вот исправленная строка:
- (void) reCreatePath {
CGMutablePathRef p = ::CGPathCreateMutable() ;
::CGPathMoveToPoint (p, 0, TL.x, TL.y) ;
// [snip]
::CGPathAddLineToPoint (p, 0, BL.x, BL.y) ;
::CGPathCloseSubpath(p) ;
self.path = p ;
::CGPathRelease(p) ; // <<== THIS IS IT!! :-)
}
Редактировать.Я до сих пор не понимаю. Я попробовал предложение Чака:
@property (nonatomic, strong) __attribute__((NSObject)) CGPathRef path ;
Вот так:
@interface TopLeftSlidingView ()
@property (nonatomic, strong) __attribute__((NSObject)) CGPathRef path ;
@end
И в тот момент, когда я воссоздаю CGPath:
- (void) reCreatePath {
CGMutablePathRef p = ::CGPathCreateMutable() ;
::CGPathMoveToPoint (p, 0, TL.x, TL.y) ;
// [snip]
::CGPathAddLineToPoint (p, 0, BL.x, BL.y) ;
::CGPathCloseSubpath(p) ;
// self.path = (__bridge CGMutablePathRef) p ;
// self.path = (__bridge_transfer CGMutablePathRef) p ;
// self.path = (__bridge_retained CGMutablePathRef) p ;
self.path = p ;
}
Любая из трех закомментированных строк приводит к ошибке компилятора. Некомментированная строка компилируется, но генерирует предупреждение анализатора:
/Users/verec/Projects/WordGame/WordGame/classes/TopLeftSlidingView.mm:211:26:
Call to function 'CGPathCreateMutable' returns a Core Foundation object with
a +1 retain count
с последующим:
/Users/verec/Projects/WordGame/WordGame/classes/TopLeftSlidingView.mm:225:5:
Object leaked: object allocated and stored into 'p' is not referenced later
in this execution path and has a retain count of +1
Я просто не понимаю этого :(
Рассмотреть возможность:
@interface Test : NSObject
@property (nonatomic, assign) CGColorRef color ;
@end
@implementation Test
- (void) dealloc {
if (self.color) {
::CGColorRelease(self.color) ;
self.color = 0 ;
}
}
- (id) init {
if (self = [super init]) {
self.color = ::CGColorRetain([UIColor blueColor].CGColor) ;
}
return self ;
}
@end
Все это компилируется (и, по-видимому, работает) нормально, за исключением того, что анализатор постоянно выдает предупреждения.
По сути, этот код говорит: «Пожалуйста, ARC, не пытайтесь делать что-либо вообще сcolor
Пожалуйста, относитесь к этому так же, как к другимassign
свойство, будь то BOOL или CGFloat, я управляю памятью все самостоятельно! "
За исключением того, что АРК отказывается слушать меня и до сих пор жалуется!
Я прочитал много вопросов здесь о SO, но ни один из них, кажется, не решает эту проблему ...
Ключевым моментом здесь, и компилятор (хотя и не анализатор), похоже, согласен с этим, является то, что, объявив свойство `assign ', я утверждал, что справляюсь со всем этим самостоятельно ...
Значит, я ошибаюсь, но я просто не понимаю, почему ...
В чем дело?