1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen

seltsamer Speicherzugriffsfehler!

Dieses Thema im Forum "OS X-Developer" wurde erstellt von fedderle, 26.06.08.

  1. fedderle

    fedderle Gast

    Hallo!
    Ich habe hier einen für mich nicht verständlichen Speicherzugriffsfehler!

    Ich habe einen kleinen Cache programmiert mit folgenden drei Funktionen:

    Löschen:
    Code:
    - (void) removeObjectForKey: (id) key
    {
        @synchronized(self)
        {
            NSLog(@"remove Element: %@", key);
            [dict removeObjectForKey: key];
         [COLOR=Red]   [cachingTimes removeObjectForKey: key];[/COLOR]
        }
    }
    
    Hinzufügen:
    Code:
    - (void) addElement: (id) element forKey: (id) key 
    {
      @synchronized(self)
      {
        // add only if element isn't in Cache already
        if(![self containsKey: key]) 
        {
            [dict setObject: element forKey: key];
        
            struct timeval tv;
            gettimeofday(&tv, NULL);
            int now = tv.tv_sec;
        
             [cachingTimes setObject: [NSNumber numberWithInt: now] forKey: key]; 
        }    
      }
    }
    
    Säübern der Elemente die länger als 10 sekuinden im Cache sind
    Code:
    - (void) cleaning
    {
        @synchronized(self)
        {
            NSArray *keys = [cachingTimes allKeys];
        
            // time now is?
            struct timeval tv;
            gettimeofday(&tv, NULL);
            int now = tv.tv_sec;
        
            // check all elements
            
            for(int i=0; i<[keys count]; i++)
            {
                if(now - [[cachingTimes objectForKey: [keys objectAtIndex: i]] intValue] > MAXCACHINGTIME)
                {
                    // if elements is in Cache longer than MAXCACHINGTIME --> remove it from Cache
                    NSLog(@"removing by cleaning");
                     [self removeObjectForKey: [keys objectAtIndex: i]];
                }
            }
        }
    }
    
    Das hat auch bis gestern alles super geklappt.
    Ich habe auch bis gestern nie von einer anderen Klasse aus "removeObejctForKey" aufgerufen. Immer nur hinzufügen und säubern. Wobei ja in "cleaning" dann die "removeObejctForKey" aufgerufen wird.

    Jetzt habe ich gestern eine neue Funktion meinem Programm hinzugefügt und nun bekomme ich eine Speicher zugriffsFehler beim Entfernen eines Elements.
    und zwar in der rot markierten Zeile:

    Es scheint so, dass das NSNumber-Objekt verschwunden ist, aber der Eintrag dafür noch in dem Dictionary "cachingtimes" vorhanden ist! Ich verstehe allerdings nicht warum? Also nach dem adden ist das NSNumber-Objekt da.

    Testweise hatte ich nun mal in der "cleaningMethode" ein return VOR dem @synchronized(self) gesetzt. Nun habe ich keinen Speicherzugriffsfehler. wenn ich aber den return befehl DIREKT HINTER dem @synchronized(self) setze, also noch bevor ich das Array lese, dann habe ich wieder den besagten Speicherzugriffsfehler.

    Hat irgendwer eine Idee, was mein Fehler ist?????

    Danke schon mal im Vorraus!

    fedderle!
     
  2. fedderle

    fedderle Gast

    OK!

    Hat sich erledigt. Ich hab den Cache komplett umgeschrieben und nun gehts!

    fedderle!
     

Diese Seite empfehlen