• Das kreative Thema des Monats Oktober wird vor allem diejenigen unter Euch besonders ansprechen, denen Do-it-yourself quasi im Blut liegt. Zeigt uns Eure Improvisationskünste oder fotografiert, was andere Leute sich so im Alltag zusammengestrickt haben. --> Zum Mitmachen bitte hier klicken

XCode 4 Anfängerprobeme..

  • Ersteller Ersteller Gelöschter User 124213
  • Erstellt am Erstellt am

Gelöschter User 124213

Gast
Hallo zusammen,

Ich teste mich gerade an iPhone-Programmierung heran. Ich werde mal schildern, was ich getan habe:

1. Projekt erstellt, View-Based Application
2. Einen Button in die Mitte des MyProjectViewController.xib geschoben
3. Eine neue Klasse per "File->New->New File->Objective-C Class" erstellt, erbend von NSObject, namens MyController
4. Ein Object in die MyProjectViewController.xib gezogen und den Typ in MyController geändert
5. Mit dem Code-Assistenten vom Knopf mit Rechtsklick in den Code gezogen, eine Action ("- (IBAction)push: (id)sender;") erstellt.
6. Build & Run

Das Programm läuft an, aber sobald ich auf den Knopf klicke, kommt folgendes:
Code:
2011-05-05 10:26:31.668 MyProject[3721:207] -[__NSCFDictionary push:]: unrecognized selector sent to instance 0x68249d0
2011-05-05 10:26:31.672 MyProject[3721:207] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFDictionary push:]: unrecognized selector sent to instance 0x68249d0'
*** Call stack at first throw:
(
	0   CoreFoundation                      0x00dc05a9 __exceptionPreprocess + 185
	1   libobjc.A.dylib                     0x00f14313 objc_exception_throw + 44
	2   CoreFoundation                      0x00dc20bb -[NSObject(NSObject) doesNotRecognizeSelector:] + 187
	3   CoreFoundation                      0x00d31966 ___forwarding___ + 966
	4   CoreFoundation                      0x00d31522 _CF_forwarding_prep_0 + 50
	5   UIKit                               0x000124fd -[UIApplication sendAction:to:from:forEvent:] + 119
	6   UIKit                               0x000a2799 -[UIControl sendAction:to:forEvent:] + 67
	7   UIKit                               0x000a4c2b -[UIControl(Internal) _sendActionsForEvents:withEvent:] + 527
	8   UIKit                               0x000a3a1c -[UIControl touchesBegan:withEvent:] + 277
	9   UIKit                               0x00036d41 -[UIWindow _sendTouchesForEvent:] + 395
	10  UIKit                               0x00017c37 -[UIApplication sendEvent:] + 447
	11  UIKit                               0x0001cf2e _UIApplicationHandleEvent + 7576
	12  GraphicsServices                    0x00ff9992 PurpleEventCallback + 1550
	13  CoreFoundation                      0x00da1944 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ + 52
	14  CoreFoundation                      0x00d01cf7 __CFRunLoopDoSource1 + 215
	15  CoreFoundation                      0x00cfef83 __CFRunLoopRun + 979
	16  CoreFoundation                      0x00cfe840 CFRunLoopRunSpecific + 208
	17  CoreFoundation                      0x00cfe761 CFRunLoopRunInMode + 97
	18  GraphicsServices                    0x00ff81c4 GSEventRunModal + 217
	19  GraphicsServices                    0x00ff8289 GSEventRun + 115
	20  UIKit                               0x00020c93 UIApplicationMain + 1160
	21  MyProject                            0x00002129 main + 121
	22  MyProject                            0x000020a5 start + 53
)
terminate called after throwing an instance of 'NSException'

Wo liegt hier das Problem? Das ist doch eigentlich die grundsätzlich richtige Funktionsweise, oder nicht?

Gruß Jackston
 
Dein Problem dürfte in der Speicherverwaltung liegen.
Die Zeile:
Code:
[__NSCFDictionary push:]: unrecognized selector sent to instance 0x68249d0
sagt aus, dass die Nachricht "push" nicht an deinen Controller ging, sondern an dem Platz im Arbeitsspeicher mittlerweile ein Dictionary liegt, welches diese Nachricht natürlich nicht versteht.

Das Problem ist wahrscheinlich, dass es in deiner XIB kein Objekt gibt, welches den Controller retained und somit am Leben hält.

Ich würde im ViewController eine retain property (IBOutlet) für den Controller anlegen und im Interface Builder mit der Instanz verbinden.
Dadurch "hält" der ViewController die Kopie von MyController am Leben.

Im dealloc vom ViewController musst du dann natürlich die property auf nil setzen oder ihr ein release schicken, damit die Intanz freigegeben wird.
 
Kannst Du erklären, was Du genau mit "retain property anlegen" meinst?
 
Geil! Hat funktioniert :) Vielen Dank!
Eine Frage habe ich noch: Dinge, die man im Interface Builder macht, wirken sich nicht direkt im Code aus, oder? Weil so könnte ich besser nachvollziehen, was der Interface Builder macht :D

Gruß Jackston

//edit: Für alle die dieses Problem auch haben und eine einfache Lösung suchen:
Vom selbst erstellten MyController-Objekt im Interface Builder per Sekundärklick in den Code vom ViewController ziehen und "Outlet erstellen", das man beliebig benennen kann -> fertig :)
 
Zuletzt bearbeitet von einem Moderator: