CG Gradient wird auf dem Simulator ausgeführt, nicht jedoch auf dem iPhone

7

Ich habe einen Code, der ohne Probleme kompiliert. Es läuft gut auf dem iPhone-Simulator, aber auf meinem Gerät erhalte ich eine EXC_BAD_ACCESS.

Dies geschieht in einer Hilfsfunktion, um den Gradienten zu zeichnen. Ich folgte diesem Tutorial , um es zu tun. Der Code, den ich habe, ist wie folgt:

%Vor%

Xcode markiert Zeile 12 (die mit nil]; als Fehlerzeile.

Für Peter Hosey, hier ist die Debugger-Ausgabe:

%Vor%

Mein Simulator (und iPhone) läuft auf iOS 5.

Was könnte diesen Absturz verursachen?

    
ksol 16.11.2011, 17:18
quelle

2 Antworten

14

Eine Möglichkeit, dies zu umgehen, besteht darin, UIColors anstelle von CGColorRefs in Ihre Funktion zu übergeben und für jedes Element Ihres Arrays (id)[color1 CGColor] eine colors -Casting-Anweisung zu verwenden. Dies scheint die beliebteste Methode zu sein, mit der Menschen dieses Problem jetzt angehen.

Ich weise auf eine Verwendung in diese Antwort , und es gibt eine ausführliche Diskussion darüber in diesem Apple Entwicklerforum-Thread . Wenn Sie die Methode -CGColor von UIColor zum Zeitpunkt der Deklaration Ihres NSArray und der Umwandlung in die ID verwenden, wird alles automatisch für Sie überbrückt. Wie gparker im oben verlinkten Foren-Thread sagt:

  

Der in der Dokumentation beschriebene automatische Fall gilt nur für   Aufrufen einer Objective-C-Methode, die einen CF-Typ und dann zurückgibt   Das Ergebnis wird sofort an einen Objective-C-Objekttyp übergeben. Wenn du   machen Sie noch etwas anderes mit dem Methodenergebnis, z. B. wenn Sie es einem zuweisen   Variable eines CF-Typs, dann ist es nicht mehr automatisch.

Wie Hatfinch darauf hinweist, könnte dies bedeuten, dass Ihre CGColorRefs, die in temporären Variablen platziert wurden, nicht nach dem letzten Verweis auf Ihre UIColors hängen bleiben, wenn Sie sie nicht explizit beibehalten. Wie die anderen in diesem Forum-Thread dachte ich fälschlicherweise, dass dies ein Bug in der Bridging-Implementierung war, aber ich kann sehen, dass ich das falsch gelesen habe.

    
Brad Larson 16.11.2011, 22:37
quelle
12

Sie behalten Ihre whiteColor und lightGrayColor nicht am Leben. Sie erhalten CGColorRefs, die Ihnen nicht gehören, aus UIColors, die niemals beibehalten werden. Ihr Code sollte lauten:

%Vor%

Sie könnten Apple bitten, - [UIColor CGColor] als objc_returns_inner_pointer zu deklarieren, was Ihren Code einfacher macht, aber dieses Attribut ist wirklich für nicht-retainable Pointer reserviert.

    
hatfinch 16.11.2011 22:17
quelle