[Obj-C] EXC_BAD_ACCESS bij het openen van een nieuw document

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ben een tijdje bezig in boeken van Objective-C, tot voor kort ging het allemaal voorspoedig en lukte het me om overal uit te komen, maar nu ben ik ergens tegenaan gelopen waar ik hulp bij nodig heb.

Deels gebaseerd op het voorbeeld uit m'n boek, heb ik een filebrowser gemaakt met een inspector. Hiermee kan je meerdere schermen open hebben, en van het geselecteerde bestand - in welk venster dan ook - worden wat details weergeven in de inspector. Om de inspector up-to-date te houden wordt er gebruik gemaakt van KVC-observing, dat werkt prima. Het probleem ligt bij het detecteren van een nieuw actief scherm, dit wordt gedaan door middel van een NSWindowDidBecomeMainNotification.

Ook dit laatste werkt in de meeste gevallen, enkel wanneer het laatste venster gesloten wordt en er een nieuwe geopend wordt niet. Dan krijg ik in de meeste gevallen een EXC_BAD_ACCESS, en in sommige gevallen een foutmelding bij het verwijderen van een observer, deze vindt je hieronder terug, na wat toelichtende code.

De volgende methode ontvangt de notification:

InspectorController.m
Objective-C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
- (void) windowChanged: (NSNotification *) notification
{
    NSWindow *window = [notification object];
    BrowserWindow *doc = [[window windowController] document];
    
    if (self.currentDocument != doc) 
    {
        [self.currentDocument.arrayController removeObserver: self
                                                  forKeyPath: @"selectionIndex"];
        
        [icon setImage: nil];
        [size setStringValue: @"-"];
        [owner setStringValue: @"-"];
        [filename setStringValue: @"(none selected)"];
        
        [doc.arrayController addObserver: self
                              forKeyPath: @"selectionIndex"
                                 options: NSKeyValueObservingOptionNew 
                                 context: NULL];
        
        self.currentDocument = doc;
    }
}


Ik ben er al achter dat het mis gaat op line 8, zodra deze uitgecomment is gaat het wel goed. Het eerste wat er in me op kwam was dat het scherm released werd op het moment ie gesloten werd, dit is niet het geval ("Release when closed" staat uit). Hierna heb ik een property gemaakt van 'currentDocument', dit op aanraden van iemand, ook dit verhielp het euvel niet.

Hier even een overzichtje van de gebruikte classes, zodat jullie het misschien wat beter kunnen begrijpen:

BrowserWindow - De class die gebruikt wordt voor het venster, is een subclass van NSDocument. (naamgeving is enigszins verwarrend, dit komt doordat het eerst een enkel venster was, omgebouwd naar een document-based app). Hier wordt de browser geladen, waar na het selecteren van een directory de bestanden in de NSCollectionView gegooid worden.

Het venster dat hier uit voortkomt:
Afbeeldingslocatie: http://i.gh.vg/uploads/klein/zcyofJQS-hwLhn5_H6tjuk5ptpm.jpg

InspectorController - Deze zorgt voor het up-to-date houden van de inspector. Zowel de KVC-observer als de NSWindowDidBecomeMainNotification zitten hier in.

De inspector:
Afbeeldingslocatie: http://i.gh.vg/uploads/klein/ijSirf-ut88I_kufu8We.jpg

In de meeste gevallen krijg ik een EXC_BAD_ACCESS, maar soms krijg ik iets als dit:
code:
1
2011-09-05 19:19:04.638 FileBrowser1[19249:707] Cannot remove an observer <InspectorController 0x10011d6b0> for the key path "selectionIndex" from <__NSCFType 0x10038e920> because it is not registered as an observer.

Op de plek van '__NSCFType' heeft ook wel eens wat anders gestaan, bijv. 'NSWindow'.


Ik heb geen enkel idee waar ik dit probleem moet zoeken, ik heb voor m'n gevoel alle mogelijkheden al geprobeerd, al is mijn kennis van Objective-C niet erg goed, hierdoor zou het goed kunnen dat ik iets over het hoofd gezien heb. Iemand die mij een zetje in de goede richting kan geven?

--

edit: Ongelooflijk, GoT heeft al een goede invloed zonder dat er iemand reageert! Het probleem is inmiddels opgelost, ben er al vele uren mee bezig geweest, en nog geen 15 nadat ik deze post geplaatst heb, is het gelukt. :+ Zal straks even kort laten weten hoe het opgelost is.

[ Voor 8% gewijzigd door Verwijderd op 05-09-2011 19:25 ]