5 Stimmen

Kann den Pfad nicht freigeben, der in Swift mit CGPathCreateMutable erstellt wurde.

Ich habe diesen einfachen Code in Swift:

override var bounds : CGRect {
  didSet {
    if (bounds != oldValue) {
      var path = CGPathCreateMutable()
      CGPathAddEllipseInRect(path, nil, bounds)
      self.path = path
      CGPathRelease(path)
    }
  }
}

Es soll einen Kreis zeichnen, der die Ebene ausfüllt, wenn sich die bounds der Ebene ändern.

Das ist aus meinem alten Objective-C Code portiert, der einwandfrei funktioniert:

- (void)setBounds:(CGRect)bounds
{
  if (CGRectEqualToRect(self.bounds, bounds)) return;

  super.bounds = bounds;
  CGMutablePathRef path = CGPathCreateMutable();
  CGPathAddEllipseInRect(path, nil, bounds);
  self.path = path;
  CGPathRelease(path);
}

Der Swift-Code stürzt jedoch ab mit einem Segfault. Wenn ich den Pfad nicht freigebe, ist alles in Ordnung. Wenn ich nicht self.path = path setze, ist es auch in Ordnung (obwohl anscheinend nichts angezeigt wird). Wenn beide vorhanden sind, stürzt es ab.

Ich denke aber, dass ein Pfad, der mit CGPathCreateMutable() erstellt wird, freigegeben werden muss.. und das scheint für ObjC der Fall zu sein. Weiß jemand, warum es in Swift nicht funktioniert? Oder habe ich etwas falsch gemacht?

Danke!

12voto

John Estropia Punkte 17340

Sie müssen CF-Objekte in Swift nicht freigeben. In Ihrem Fall gibt CGPathCreateMutable() ein CGPath-Objekt zurück (nicht CGPathRef) und wird genauso wie jedes Swift-Objekt verwaltet. Dies wurde im WWDC-Video Swift Interoperabilität im Detail erklärt.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X