2009-06-30 4 views
1

Noch ein C# /. NET Typ versucht Objective-C mit großen Träumen Millionen mit einer iPhone App zu machen :)MyObject reagiert möglicherweise nicht auf Nachricht "-Foo". (Noob) Objective-C Frage

Ok, ich bin mir sicher, diese Frage stammt von mir so an statische typisierte Sprachen gewöhnt, und deshalb habe ich eine harte Zeit, sich anzupassen, aber hier ist mein Problem. Nehmen wir an, ich eine Klasse namens MyObect haben:

MyObject.h

@interface MyObject : NSObject 
{ 

} 

-(void)Foo; 

@end 

MyObject.m

#import "MyObject.h" 
@implementation MyObject 

-(void)Foo 
{ 
    //do something fooey 
} 

@end 

Jetzt mess Ich versuche, mit einem NSMutableArray dieser Objekte , also fülle ich in meinem Hauptteil ein Array dieser Objekte so:

NSMutableArray *array = [[NSMutableArray alloc] init]; 
for(int i = 0; i<10;i++) 
{ 
    MyObject *obj = [[MyObject alloc]init]; 
    [array addObject:obj]; 
} 

Nichts Besonderes. Jetzt versuchte ich jedoch, das erste Array herauszuziehen und die foo-Methode aufzurufen. Also, hier bin ich verwirrt. Ich habe dies versucht:

MyObject *obj = [array objectAtIndex:1]; 
[obj Foo]; 

und während dies funktioniert, bekomme ich eine Warnung von MyObject nicht auf die Nachricht antworten. Also, ich dachte, ok, lass mich es werfen:

MyObject *obj = (MyObject *)[array objectAtIndex:1]; 
[obj Foo]; 

und das gibt mir auch die Warnung.

Ich denke, meine Frage ist eine grundlegende Frage, wie Sie Elemente in einer Sammlung speichern, und wie Sie sie herausziehen und immer noch den Typ des Objekts behalten. Wieder komme ich von einem .NET-Hintergrund, also ist mein Denken möglicherweise grundlegend fehlerhaft, also wenn mich jemand in die richtige Richtung zeigen könnte, würde ich es sehr schätzen.

BEARBEITEN: Mein ursprünglicher Code hatte in der Tat das Sternchen in der Besetzung (ohne sie erhalten Sie einen Kompilierfehler). Es zeigt immer noch die Warnung aber ...

Antwort

1

Dies sollte keine Warnung geben, vorausgesetzt, dass Sie das Sternchen, wie Sie in einem Kommentar zu einer anderen Antwort beschreiben. Tatsächlich denke ich, dass die Besetzung unnötig ist - selbst die Version ohne Besetzung sollte keine Warnung geben.

Stellen Sie sicher, dass die Headerdatei MyObject.h am Anfang der Datei importiert wird, in der Sie versuchen, Ihre Methode aufzurufen. Die Warnung, die Sie erhalten, ist typisch für Fälle, in denen Sie eine Klasse mit @class MyObject nach vorne deklariert haben, aber nicht die Kopfzeile mit #import "MyObject.h".

BTW, in Objective-C startet man normalerweise Methodennamen mit einem Kleinbuchstaben, wie in Java.

+0

Es ist nicht so, dass es nicht funktioniert, es baut und läuft erfolgreich, aber ich bekomme eine Warnung vom (XCode) Compiler. Ich könnte es einfach ignorieren, aber ich habe einfach das Gefühl, dass ich etwas falsch mache. (Danke für die Informationen über Methodenbenennungspraktiken.) – BFree

+0

redigierte meine Antwort, um zu spezifizieren, was ich mit "Arbeit" meinte :-) – harms

+0

Ich prüfte einfach, und ja, die Headerdatei wird oben mit #import eingeschlossen. (Ohne es, bekomme ich Kompilierzeit Fehler, die es nicht einmal bauen lassen). Ich bekomme trotzdem die Warnung. (Ich fühle mich wie so ein komisches Noob !!) Danke für deine Hilfe. – BFree

1

Ändern Sie Ihre Gießanlage zu:

MyObject *obj = (MyObject *)[array objectAtIndex:1]; 

Das fehlende * das Problem ist.

+0

Das war eigentlich ein Tippfehler meinerseits in der Frage. Mein Fehler. Mein Code * hat * den Stern, aber ich bekomme immer noch die Warnung. – BFree

+0

Stellen Sie sicher, dass Sie "MyObject.h" in die Datei importieren, in der Sie die Array-Verarbeitung durchführen. –

1

OK, ich fühle mich jetzt wie ein totaler Idiot :(Ich habe vergessen, die Methodendeklaration in die Headerdatei einzufügen. Die Tatsache, dass ihr beide betont habt, dass ich sicherstellen muss, dass ich die Headerdatei importiere, hat mir das bewusst gemacht. Danke euch beiden für eure Hilfe.

Verwandte Themen