extrem viele memory leaks

  • extrem viele memory leaks

    hallo,

    ich checke meine app seit ein paar tagen mit instruments und ich verstehe einfach nicht wo die ganzen leaks herkommen :(

    dauernd sowas:
    Leaked Object:
    NSCFString
    NSCFString
    NSCFString
    NSCFString
    NSCFString
    NSCFString
    NSCFString
    und immer weiter.. ich weiß gar nicht was das für leaks sind und wo die herkommen ..

    ich habe was von NSZombieEnabled und CFZombieLevel gelesen, dass man wohl CFZombieLevel auf 16 gesetzt ist oder so...hmm aber wo/wie setzt man denn das?
    und auf welchen wert sollte man es setzten?

    mfg
    moritz
  • Original von moritz91
    und was sind nun meine leaks ..kennt die jemand ?
    verweifel hier grad völlig :(

    +lacht+
    Geniale Frage. :D
    Jaja, ich kenn die Leaks persönlich. Der erste heißt Heinz, ist anonymer Alkoholiker und treibt sich meistens an Speicheradresse 0xA8329AFCEFF8 rum.
    Der zweite heißt...

    Lassen wir das.
    Du vergisst garantiert irgendwo -release oder -autorelease.
    Wie stehts bei dir mit den Grundlagen?
    «Applejack» "Don't you use your fancy mathematics to muddle the issue!"

    Iä-86! Iä-64! Awavauatsh fthagn!

    kmr schrieb:

    Ach, Du bist auch so ein leichtgläubiger Zeitgenosse, der alles glaubt, was irgendwelche Typen vor sich hin brabbeln. :-P
  • ja ich hab letztens nochmal meine unterlagen rausgekramt zur speicherverwaltung und hab auch wieder wissen aufgebessert..vielleicht ist es alles auch nur zu unübersichtlich und ich sollte die app nochmal völlig neu aufsetzten

    naja dann stell ich nochmal ne kleine nebenfrage:

    zu jedem outlet sollte man doch auch eine property schreiben und es am ende der implementierungsdatei in der dealloc methode = nil setzten richtig? ...ist es da eigentlich egal ob ich es release oder auf nil setzte? release führt doch dazu das dem zähler -1 abgezogen wird ..wenn es dadurch auch auf 0 counts kommt wird der speicher doch genau so freigeben oder?
  • Original von moritz91
    hmm ich dachte, dass mir jemanden erklären kann was dieser NSCFString überhaupt ist

    NSCFString ist die konkrete Unterklasse von NSString, in der Strings intern implementiert sind. NSString selbst ist nur eine abstrakte Klasse, von der direkt niemals Objekte erzeugt werden. Für dich heißt das: immer wenn du NSCFString siehst, handelt es sich um einen NSString (oder einen CFString, aber den wirst du normalerweise kaum verwenden).
  • Original von elo

    NSCFString ist die konkrete Unterklasse von NSString, in der Strings intern implementiert sind. NSString selbst ist nur eine abstrakte Klasse, von der direkt niemals Objekte erzeugt werden. Für dich heißt das: immer wenn du NSCFString siehst, handelt es sich um einen NSString (oder einen CFString, aber den wirst du normalerweise kaum verwenden).



    ah ok ..also sind das alle strings die ich erstelle aber nicht korrekt freigebe?
  • Original von moritz91ah ok ..also sind das alle strings die ich erstelle aber nicht korrekt freigebe?

    Zunächst mal solltest du feststellen, ob du die Leaks veursachst oder ob sie in Apple's Frameworks liegen (ja, auch Apple schreibt fehlerhaften Code). Die verantwortliche Bibliothek wird dir in Instruments ja angezeigt. Und wenn du bestätigt hast, dass es deine Fehler sind, gibt's ja auch noch (z.B.) Build & Analyze und vieles mehr.
  • Original von moritz91
    hm das irgendwo speicher angefordert wurde aber nicht mehr freigegeben wird und der speicher sich somit immer weiter füllt usw.

    nicht richtig?

    Quellcode

    1. <Pseudo-AppDelegate:Header>
    2. @interface AppDelegate:NSObject {
    3. NSArray* arrayEins;
    4. NSArray* arrayZwei;
    5. ...
    6. NSArray* arrayZigTausendSiebenhundertAchtundneunzig;
    7. }
    8. @end
    9. <Pseudo-AppDelegate:Implementation>
    10. @implementation AppDelegate
    11. - (id)init {
    12. arrayEins = [[NSArray alloc] init];
    13. arrayZwei = [[NSArray alloc] init];
    14. ...
    15. arrayZigTausendSiebenhundertAchtundneunzig = [[NSArray alloc] init];
    16. }
    17. //Restcode
    18. -(void)dealloc {
    19. [arrayEins release];
    20. [arrayZwei release];
    21. ...
    22. [arrayZigTausendSiebenhundertAchtundneunzig release];
    23. [super dealloc];
    24. }
    25. @end
    Alles anzeigen


    ZigTausendSiebenhundertAchtundneunzig Leaks oder nicht?

    Dein Speicher füllt sich ständig, während deine Anwendung läuft. Permanent. Andauernd. Ohne Speicher läuft deine Anwendung schlicht nicht.
    Es ist also völlig normal, dass während des Laufens deiner Anwendung Speicher genutzt wird.

    Was ist also ein Leak?
    «Applejack» "Don't you use your fancy mathematics to muddle the issue!"

    Iä-86! Iä-64! Awavauatsh fthagn!

    kmr schrieb:

    Ach, Du bist auch so ein leichtgläubiger Zeitgenosse, der alles glaubt, was irgendwelche Typen vor sich hin brabbeln. :-P
  • Ich geb da gar nix frei.
    Der wird erst freigegeben, wenn mein AppDelegate beim -dealloc angekommen ist.
    Das dauert im Allgemeinen bis zum Beenden der Anwendung.
    «Applejack» "Don't you use your fancy mathematics to muddle the issue!"

    Iä-86! Iä-64! Awavauatsh fthagn!

    kmr schrieb:

    Ach, Du bist auch so ein leichtgläubiger Zeitgenosse, der alles glaubt, was irgendwelche Typen vor sich hin brabbeln. :-P