• 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

unrecognized selector sent to instance

Bissy

Raisin Rouge
Registriert
03.02.07
Beiträge
1.176
Hi,

habe eben - angelehnt an die Übungsaufgaben aus dem Buch von Amin Negm-Awad mal versucht, eine Art minimalistischen Währungsrechner zu bauen.

Leider bekomme ich nun in der Konsole folgende Meldung:

Code:
[Switching to process 83163]
Running…
2010-03-08 23:23:48.604 Converter3[83163:a0f] -[_NSControllerObjectProxy copyWithZone:]: unrecognized selector sent to instance 0x10042e830
2010-03-08 23:23:48.607 Converter3[83163:a0f] -[_NSControllerObjectProxy copyWithZone:]: unrecognized selector sent to instance 0x10042e830
2010-03-08 23:23:48.618 Converter3[83163:a0f] -[_NSControllerObjectProxy copyWithZone:]: unrecognized selector sent to instance 0x100445d80
2010-03-08 23:23:48.618 Converter3[83163:a0f] -[_NSControllerObjectProxy copyWithZone:]: unrecognized selector sent to instance 0x100445d80

Leider kann ich damit nichts anfangen. Bin das aus anderen Programmiersprachen so gewöhnt, dass der Compiler auch so Sachen meldet wie "Fehler in Zeile xy". Leider geschieht das hier ja nicht, ich weiß also gar nicht, wo ich anfangen soll, zu suchen.

Habe dann eben noch mal das Buch aufgeschlagen und die Schritte durchgesehen... Leider ohne Erfolg, ich finde keine Stelle, an der ich etwas falsch gemacht habe.

Vielleicht springt ja jetzt einer auf und sagt "jaaaaa.... Bei der Fehlermeldung guckst du IMMER an Stelle xy" :D

Danke
 

gKar

Maunzenapfel
Registriert
25.06.08
Beiträge
5.362
Ich bin ja kein erfahrener Obj-C-Programmierer, aber soviel theoretische Grundkenntnisse über diese Sprache habe ich schon:
Ein Methodenaufruf wird dynamisch aufgelöst. Dazu wird eine Nachricht an eine Objekt-Instanz geschickt. Die auszuführende Methode wird dabei über einen sog. „Selector“ spezifiziert.

In Deiner Fehlermeldung steht also m.E., dass weder das angesprochene Objekt noch eine seiner Superklassen eine Methode aufweist, die zum geschickten Selector (das dürfte „CopyWithZone:“, also eine Methode mit genau einem Parameter sein) passt.

Wobei ich mich schon frage, wie das programmiert wurde, dass der Fehler erst zur Laufzeit auftritt. Wenn nicht mit „id“-Variablen, sondern mit typisierten Zeigern auf Objekte gearbeitet wird, müssten solche Aufrufe meines Wissens schon Compilerwarnungen auslösen.

Aber wie gesagt: Ich kenne nur theoretische Grundzüge der Sprache und habe keine praktischen Erfahrungen.
 

Poljpocket

Salvatico di Campascio
Registriert
07.01.07
Beiträge
432
gKar sagt eigentlich alles, was es hierzu zu sagen gibt. Du sendest einen Methodenaufruf an ein Objekt, welches diese Methode nicht kennt. Da du das Objekt nicht richtig typisiert hast, merkt der compiler den Fehler nicht, weil die Methoden erst zur Laufzeit gebunden werden (resp. geschaut wird, was das jeweilige Objekt versteht, und was nicht). dynamic binding nennt man das. Praktisch aber eine häufige Fehlerquelle.

Ich kann dir nicht sagen, was _NSControllerObjectProxy für eine Klasse ist, aber irgend einen Fehler produzieren Instanzen von dieser Klasse. Die Methode ist, wie schon gesagt wurde: - copyWithZone: ... Es sieht ganz danach aus, als ob du als Programmierer nicht viel mit diesem Fehler zu tun hast, es sei denn, du verwendest diese Instanzen von _NSControllerObjectProxy. Dies ist aber mit grosser Wahrscheinlichkeit eine undokumentierte Hilfsklasse in Cocoa.

Versuch den Fehler mit NSLog und/oder breakpoints einzugrenzen und poste dann mal den Abschnitt, in dem der Fehler auftaucht.

Gruss ppocket
 

Bissy

Raisin Rouge
Registriert
03.02.07
Beiträge
1.176
Habe schon mit den Breakpoints versucht es einzugrenzen. Habe einen Breakpoint nach der ersten Zeile in meinem Header gesetzt und der Fehler taucht trotzdem auf. Die Methode "copyWithZone:" sagt mir nichts, habe diese also auch nicht implementiert. Ich habe nur eine Methode, die heißt "convert". Ich denke, dass das Problem an der Core Data liegt. Habe da noch so meine Probleme mit den Bindings und denke einfach mal, dass ich da ein Häkchen falsch gesetzt habe oder so.
 

Bissy

Raisin Rouge
Registriert
03.02.07
Beiträge
1.176
Habe jetzt mal meinen Array Controller gelöscht und damit auch alle Bindings.. Nun startet das Programm. Werde jetzt die Bindings nochmal neu setzen. Finde es manchmal etwas verwirrend, zu selektieren, welche Auswahl bei "Controller Keys" bzw. "Model Key Path" bei den Bindings gemacht werden muss. Gibt es da noch weiter gehende Literatur?

In dem Buch wird mehr oder weniger einfach gesagt, "dies und jenes anklicken", aber warum und was die Alternativen bewirken, bleibt etwas außen vor. Ich glaub ich durchforste mal die Documentation.
 

Bissy

Raisin Rouge
Registriert
03.02.07
Beiträge
1.176
So, habe jetzt eine Auflösung. Ich habe keine Ahnung warum, aber jetzt läuft es einwandfrei. Habe einfach den Array Controller mal entfernt, dann ging es, allerdings logischerweise ohne die Funktionalität. Dann habe ich ihn wieder eingefügt, die Bindings neu gesetzt und jetzt läuft es.
Habe mich auch mal ein bisschen durch die Documentation gesucht um etwas darüber rauszufinden, was die ganzen Einträge bei den Bindings bedeuten (selection, arrangedObjects usw), leider aber nichts genaues gefunden. Vielleicht hat da ja jemand mal einen netten Link für mich.
 

Poljpocket

Salvatico di Campascio
Registriert
07.01.07
Beiträge
432
Diese Begriffe bedeuten in den allermeisten Fällen genau das, was sie sagen. Selection ist das ausgewählte Objekt. ArrangedObjects die Objekte im Array, welche er verwaltet.
 

sumpfmonsterjunior

Morgenduft
Registriert
17.03.05
Beiträge
167
Nur von den Stichworten CoreData und Bindings Deiner copyWithZone-Fehlermeldung vermute ich, dass Du (in einer Tableview?) direkt an ein NSManagedObject gebunden hast. NSManagedObject implementiert nicht das NSCopying-Protokoll. Das copyWithZone rufst Du auch nicht direkt auf, das machen die Controller.

In welchem Zusammenhang tritt der Fehler denn auf?
 

MacApple

Schöner von Bath
Registriert
05.01.04
Beiträge
3.652
So, habe jetzt eine Auflösung. Ich habe keine Ahnung warum, aber jetzt läuft es einwandfrei.
Ich habe da so eine Ahnung. Du bindest sicherlich einen NSTableView über einen NSArrayController an Dein Modell. Dabei hast Du vermutlich eine Bindung nur an die selection vom NSArrayController gemacht und nicht noch die Konkrete Eigenschaft angegeben. Die Methode selection von den NS...Controllern liefert ein Proxy-Objekt zurück, welches vollständig Key-Value-Coding compliant ist, wie das „Originalobjekt“ im Modell. NSTableView erstellt unter gewissen Bedingungen Kopien von den darzustellenden Objekten und so bekam dann wohl so ein Proxy-Objekt eine copyWithZone:-Nachricht geschickt, die es nicht versteht.
Jetzt bindest Du dann wohl richtig an selection.eigenschaft.

MacApple
 

Bissy

Raisin Rouge
Registriert
03.02.07
Beiträge
1.176
So in etwa muss es gelaufen sein. Ich war zwar sicher, dass ich es an das richtige Attribut in der selection gebunden hatte, aber es kann auch sein, dass da der Fehler drin steckte.

Finde es einfach manchmal verwirrend. Den ganzen TableView auf arrangedObjects, dann die einzelne Spalte auf... tja seht ihr.. Da hörts schon wieder auf :) Jetzt muss ich wieder nachschauen. Aaarrgghhh