Speicherverwaltung

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Speicherverwaltung

    Hallo,

    mit folgender Methode erzeuge ich alle CGColors in meinen Programm:

    Quellcode

    1. - (CGColorRef)CreateDeviceRGBColor:(CGFloat)r green:(CGFloat) g blue:(CGFloat)b alpha:(CGFloat)a{
    2. CGColorSpaceRef rgb = CGColorSpaceCreateDeviceRGB();
    3. CGFloat comps[] = {r, g, b, a};
    4. CGColorRef color = CGColorCreate(rgb, comps);
    5. CGColorSpaceRelease(rgb);
    6. return color;}



    die Methode wird wie so aufgerufen:

    Quellcode

    1. ...
    2. CGColorRef color =[self CreateDeviceRGBColor:0.2 green:0.2 blue:0.2 alpha:0.2];
    3. layer.shadowColor =color;...


    anschließend wird die color released

    Quellcode

    1. CFRelease(color);


    und genau hier liegt mein Problem.

    Der Analyzer gibt folgende Wahrung aus:


    "incorrect decrement of the reference count of an object that is not owned at this point by the caller"

    Was mache ich falsch?
  • Ne e

    gritsch schrieb:

    liegt wohl am methoden-name. der analyzer denk denkt dass dir das objekt nicht gehört was es aber tut.


    Ne, eigentlich hat dr analyzer recht. Das object gehört der Methode die es erzeugt hat. Freigegeben wird es aber in der Methode die die Methode aufruft die es erzeugt. Also eigentlich nicht oop gerecht

    Gruß

    Claus
    2 Stunden Try & Error erspart 10 Minuten Handbuchlesen.

    Pre-Kaffee-Posts sind mit Vorsicht zu geniessen :)
  • Thallius schrieb:

    Ne e

    gritsch schrieb:

    liegt wohl am methoden-name. der analyzer denk denkt dass dir das objekt nicht gehört was es aber tut.


    Ne, eigentlich hat dr analyzer recht. Das object gehört der Methode die es erzeugt hat. Freigegeben wird es aber in der Methode die die Methode aufruft die es erzeugt. Also eigentlich nicht oop gerecht

    Gruß

    Claus


    deswegen müsste der methodenname auch anders lauten dass der analyzer das auch versteht (woher sollte er es sonst wissen)
  • CF_RETURNS_RETAINED sollte es tun. Mal probieren.

    Bei richtiger Benamsung ist es wohl so, dass jedenfalls der Analyzer undokumentiert die CF-Benamsung auch auf Methoden anwendet. Dann könntets du mal probieren, das Create klein zu schreiben oder etwas vor das Create zu setzen, meinetwegen kjhsdf. Aber das ist wie gesagt nicht dokumentiert.
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?
  • ich habe mit einer weiteren Methode das selbe Problem:

    - (CGPathRef)getPath: (NSArray * )arrayPathValue{

    ... path_Erzeugung nach Parametern...

    return path;
    }

    der Methodennamen taugt als alleinige Erklärung also nicht.

    Aber wie soll man denn ein CG..Ref zurückgeben und es anschießend korrekt releasen?
  • Noch einmal: Saubere Methode dürfte CF_RETURNS_RETAINED sein. Google mal danach.

    Wenn du das undokumentierte (wohl) bestehende Feature nutzen möchtest, müsste die Methode -pathCreate heißen. Get ist ohnehin ganz falsch. Lies hierzu noch einmal die Cocoa-Namensregeln.
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?
  • Attribute 'cf_returns_retained' (Clang-specific)

    The GCC-style (Clang-specific) attribute 'cf_returns_retained' allows one to annotate an Objective-C method or C function as returning a retained Core Foundation object that the caller is responsible for releasing.
    clang-analyzer.llvm.org/annota…#attr_cf_returns_retained

    Ah, dort ist übrigens auch das Feature dokumentiert:
    Treating the function as if it its name contained the keywords "create" or "copy".

    Stimmt nicht, weil der Text nur C-Funktionen betrifft. Es bleibt also undokumentiert.
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von Amin Negm-Awad ()

  • gritsch schrieb:

    warum? steht doch hier:

    You own any object you create
    You create an object using a method whose name begins with “alloc”, “new”, “copy”, or “mutableCopy”

    Nur Objective-C-Objekte unterliegen dem ARC. "object" in diesem Satz bedeutet Objective-C-Object.

    Mit CF-"Objekten" hat das ARC von Objective-C nichts am Hut.

    Das ist ja der Grund, warum es CF_RETURNS_RETAINED et al. gibt und NS_RETURNS_RETAINED et al. Man kann das nicht über einen Kamm scheren. Steht aber auch alles im verlinkten Dokument.
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?
  • Amin Negm-Awad schrieb:

    gritsch schrieb:

    warum? steht doch hier:

    You own any object you create
    You create an object using a method whose name begins with “alloc”, “new”, “copy”, or “mutableCopy”

    Nur Objective-C-Objekte unterliegen dem ARC. "object" in diesem Satz bedeutet Objective-C-Object.

    Mit CF-"Objekten" hat das ARC von Objective-C nichts am Hut.

    Das ist ja der Grund, warum es CF_RETURNS_RETAINED et al. gibt und NS_RETURNS_RETAINED et al. Man kann das nicht über einen Kamm scheren. Steht aber auch alles im verlinkten Dokument.


    wo steht hier was von ARC?

    hier gehts doch nur um den analyzer und um methodennamen anhand er den besitzer eines objektes erkennt.
  • gritsch schrieb:

    Amin Negm-Awad schrieb:

    gritsch schrieb:

    warum? steht doch hier:

    You own any object you create
    You create an object using a method whose name begins with “alloc”, “new”, “copy”, or “mutableCopy”

    Nur Objective-C-Objekte unterliegen dem ARC. "object" in diesem Satz bedeutet Objective-C-Object.

    Mit CF-"Objekten" hat das ARC von Objective-C nichts am Hut.

    Das ist ja der Grund, warum es CF_RETURNS_RETAINED et al. gibt und NS_RETURNS_RETAINED et al. Man kann das nicht über einen Kamm scheren. Steht aber auch alles im verlinkten Dokument.


    wo steht hier was von ARC?

    hier gehts doch nur um den analyzer und um methodennamen anhand er den besitzer eines objektes erkennt.

    ARC und Analyzer sind dasselbe. Die Idee von ARC ist es, die Warnings des Analyzers nicht zu loggen, sondern es einfach gleich richtig zu machen. Deshalb sind die Bedinungen, unter denen der Analyzer meckert dieselben, wie die Bedingungen, unter denen ARC nicht funktioniert. (Wobei das dann eben auch vom Analyzer angemeckert wird. Es wäre doch auch reichlich komisch, wenn du etwas mit ARC richtig machst und der Analyzer es anmeckert oder wenn du etwas mit ARC falsch machst und der Analyzer es nicht anmeckert. Immerhin haben die beide dieselbe Funktion: Speicherverwaltungsregeln einzuhalten, was die Namensregeln beinhaltet.)

    Das Problem ist hier, dass der Returnwert ein CF-Objekt ist. Ein CF-Objekt wird /nicht/ behandelt. Es gibt keine offizielle Regel, welche Bedeutung welcher Methodenname hat, wenn ein CF-Objekt zurückgegeben wird. Es gibt nur Regeln,

    - welche Bedeutung ein Methodenname hat, wenn er ein Objective-C-Objekt zurückgibt,
    - welche Bedeutung ein Funktionsname hat, wenn er ein CF-Objekt zurückgibt.

    Hier haben wir den Fall, dass eine Methode (oben 1) ein CF-Objekt (oben 2) zurückgibt. Dieser Fall ist nicht dokumentiert, wenngleich es wohl – ich habe es nicht überprüft, mich interessiert es auch nicht, weil ich mich nicht auf undokumentierte Features verlasse – so ist, dass ARC (also der Analyzer) dann den Methodennamen wie eine C-Funktionsnamen behandelt. Der richtige Namensbestandteil wäre dann also Create und Copy, nicht Alloc und Copy. (Ja, Copy ist bei beiden gleich.) Das ist aber nicht dokumentiert, wie gesagt.

    Dokumentiert und dafür vorgesehen ist der Modifier CF_RETURNS_RETAINED.

    Wieso liest du nicht einfach die Doku, die ich verlinkt habe?
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?
  • The analyzer supports the proper management of retain counts for both Cocoa and Core Foundation objects. This checking is largely based on enforcing Cocoa and Core Foundation naming conventions for Objective-C methods (Cocoa) and C functions (Core Foundation). Not strictly following these conventions can cause the analyzer to miss bugs or flag false positives.
  • Boah, so schwer ist das doch nicht. Als Rückgabewerte von Methoden.


    Es gibt nur Regeln,

    - welche Bedeutung ein Methodenname hat, wenn er ein Objective-C-Objekt zurückgibt,
    - welche Bedeutung ein Funktionsname hat, wenn er ein CF-Objekt zurückgibt.

    Alkles andere ist nciht offiziell dokumentiert.
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?
  • Ich habe sie dir sogar tief verlinkt:

    1.
    The GCC-style (Clang-specific) attribute 'cf_returns_retained' allows one to annotate an Objective-C method or C function as returning a retained Core Foundation object that the caller is responsible for releasing.

    2.
    Placing on Objective-C methods: With respect to Objective-C methods., this attribute is identical in its behavior and usage to 'ns_returns_retained' except for the distinction of returning a Core Foundation object instead of a Cocoa object. This distinction is important for two reasons:

    - […]
    Because Core Foundation is a C API, the analyzer cannot always tell that a pointer return value refers to a Core Foundation object. In contrast, it is trivial for the analyzer to recognize if a pointer refers to a Cocoa object (given the Objective-C type system).

    3.
    Placing on C functions: When placing the attribute 'cf_returns_retained' on the declarations of C functions, the analyzer interprets the function as:

    - […]
    - Treating the function [Nicht: Methode] as if it its name contained the keywords "create" or "copy". This means the returned object as a +1 retain count that must be released by the caller, either by sending a release message (via toll-free bridging to an Objective-C object pointer), calling CFRelease (or similar function), or using CFMakeCollectable to register the object with the Objective-C garbage collector.

    Wie man leicht sehen kann, gbt es in dem Abschnitt CF-Objekt für Methoden anders als im CF-Abschnitt CF-Objekt für Funktionen /keine/ Namensregel. Dass das wohl ganz gut funktioniert, hatte ich schon ein paar Mal erwähnt. Es ist aber nicht dokumentiert.
    Unmittelbar darunter gibt es ein explizites Beispiel mit richtigem Vorgehen und falschem Vorgehen:
    Richtig:

    Brainfuck-Quellcode

    1. CF_RETURNS_RETAINED // <<<<---------<<<<<<------
    2. CFDateRef returnsRetainedCFDate() {
    3. return CFDateCreate(0, CFAbsoluteTimeGetCurrent());
    4. }


    Villeicht klickst du mal auf den Link und liest ihn. Soll ich es dir auch noch übersetzen?
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?