Zuweisen von Eigenschaften, ARC- und Core Foundation-Objekten

Bearbeiten 2.

Dank anKen das funktioniert jetzt. Und ich glaube sogar, ich verstehe warum :-)

Hier ist die geänderte Zeile:

- (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!! :-)
}
Bearbeiten.

Ich verstehe es immer noch nicht. Ich habe versucht, Chuck Vorschlag:

@property (nonatomic, strong) __attribute__((NSObject)) CGPathRef  path ;

Wie so:

@interface TopLeftSlidingView  ()

@property (nonatomic, strong) __attribute__((NSObject)) CGPathRef  path ;

@end

Und an dem Punkt, an dem ich den CGPath neu erstelle:

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

Jede der drei auskommentierten Zeilen führt zu einem Compilerfehler. Die nicht kommentierte Zeile wird zwar kompiliert, generiert jedoch eine Analyse-Warnung:

/Users/verec/Projects/WordGame/WordGame/classes/TopLeftSlidingView.mm:211:26:
 Call to function 'CGPathCreateMutable' returns a Core Foundation object with
 a +1 retain count

gefolgt von:

/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

Ich verstehe es einfach nicht :(

Erwägen:

@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

Dies alles kompiliert (und läuft scheinbar) einwandfrei, mit der Ausnahme, dass der Analysator weiterhin Warnungen ausgibt.

Im Wesentlichen besagt dieser Code: "Bitte ARC, mach dir überhaupt keine Mühe damitcolorBitte behandeln Sie es so, wie Sie es bei jedem anderen tun würdenassign Eigentum, sei es ein BOOL oder CGFloat, ich kümmere mich allein um die Speicherverwaltung! "

Nur dass ARC sich weigert, mir zuzuhören und sich immer noch beschwert!

Ich habe hier viele Fragen zu SO gelesen, aber keine scheint dieses Problem anzugehen ...

Das Entscheidende hier und der Compiler (wenn auch nicht der Analysator) scheint zuzustimmen, ist, dass ich durch die Deklaration der Eigenschaft "assign" behauptet habe, alles selbst zu handhaben ...

Also muss ich mich irren, aber ich verstehe einfach nicht warum ...

Was ist falsch?

Antworten auf die Frage(1)

Ihre Antwort auf die Frage