• Apfeltalk ändert einen Teil seiner Allgemeinen Geschäftsbedingungen (AGB), das Löschen von Useraccounts betreffend.
    Näheres könnt Ihr hier nachlesen: AGB-Änderung
  • Was gibt es Schöneres als den Mai draußen in der Natur mit allen Sinnen zu genießen? Lasst uns teilhaben an Euren Erlebnissen und macht mit beim Thema des Monats Da blüht uns was! ---> Klick

seltsamer Speicherzugriffsfehler!

  • Ersteller fedderle
  • Erstellt am

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!
 

fedderle

Gast
OK!

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

fedderle!