• Apfeltalk ändert einen Teil seiner Allgemeinen Geschäftsbedingungen (AGB), das Löschen von Useraccounts betreffend.
    Näheres könnt Ihr hier nachlesen: AGB-Änderung
  • Viele hassen ihn, manche schwören auf ihn, wir aber möchten unbedingt sehen, welche Bilder Ihr vor Eurem geistigen Auge bzw. vor der Linse Eures iPhone oder iPad sehen könnt, wenn Ihr dieses Wort hört oder lest. Macht mit und beteiligt Euch an unserem Frühjahrsputz ---> 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!