Objective C



  • Lohnt es sich Objective C zu lernen?
    Was für Vorteile hat das zu C++?



  • Lohnt es sich Objective C zu lernen?

    Wenn du unter Mac OS programmierst auf jeden Fall. Ansonsten ist es immer interessant eine neue Sprache kennenzulernen.

    Was für Vorteile hat das zu C++?

    Es verwendet die dynamische Bindung statt der späten Bindung, wie in C++. Dadurch hast du wesentlich mehr Flexibilität. Aufgaben, für die du mit Templates rumhantieren musst, oder die gar unmöglich scheinen sind in Objective-C auch ohne recht einfach lösbar. Reflexion ist in Objective-C kein Problem. Du kannst Methoden wesentlich bessere Namen geben, da Argumente in den Namen mit eingebunden werden. Selektoren sind wesentlich einfacher und intuitiver handhabbar als umständliche Methodenzeiger. Und und und ...

    Natürlich gibt's auch Nachteile (nach denen du nicht gefragt hast), wie das die dynamsiche Bindung etwas langsamer ist, als die späte. Wenn du ein Objekt ein paar mal verwendet hast stehen im Cache des Klassenobjekts aber die wichtigsten Methoden, weshalb der Aufruf dann eigentlich recht schnell ist (zumindest ist das bei Apples Compiler so).



  • klingt aufjedenfall interessant auch wenn ich nicht für Mac progge.
    Besonders weil ich OO-Programmieren mit C++ schon immer etwas schwerfällig fand, Java als Alternative mir aber etwas zu langsam ist. Kannst du mir irgendein OC-Einsteiger-Tutorial empfehlen für jemand der schon gut C++ und Java kann (ich meine, was eine Variable ist oder was OO grundlegend bedeutet braucht man mir nicht nochmal erklären;) ) ?



  • Ich kann mir unter dynamischer Bindung nichts vorstellen, bzw. dachte bisher, das sei ein Synonym zu späte Bindung. Kannst du mal ganz kurz erklären was das ist?



  • ich finde dieses dokument gut für einen überblick...

    bin grad am lesen 😉
    http://developer.apple.com/documentation/Cocoa/Conceptual/ObjectiveC/2objc_oop/index.html

    kann als pdf geladen werden



  • Ich kann mir unter dynamischer Bindung nichts vorstellen, bzw. dachte bisher, das sei ein Synonym zu späte Bindung.

    Cool. Den selben Satz habe ich heute, kaffeeschlürfend in meiner Küche sitzend, auch schon formuliert. Gut zu wissen, dass ich mit meiner Unwissenheit in so prominenter Gesellschaft bin 😃



  • Ich weiß nicht, ob die Begriffe 'späte' und 'dynamische' Bindung richtig sind.

    In C++(ohne Templates)/Java/Delphi isses so:

    Du hast ein Objekt, das hat bestimmte Methoden. Du kannst diese Methoden aufrufen, bist aber typgebunden. D.h. Du musst den Typ des Objekts wissen, um ne Methode davon aufrufen können (Polymorphie etc. spielt hier nicht die Rolle)

    C++ mit Templates
    Du arbeitest typunabhängig. D.h. Du weißt von dem Objekt, das Du hast nur, dass es die Methode hat, die Du an der Stelle brauchst. Das ganze wird vom Compiler überprüft.

    Objectiv C / Smalltalk
    Wie mit den templates, nur dass das ganze erst zur Laufzeit entschieden wird. D.h. der Typ ist Dir egal, Du weißt nur, dass das Objekt das Du hast, diese Methode, die Du brauchst, hat.
    In Smalltalk-Nomenklatur ruft man auch keine Methoden auf, sondern sendet eine Nachricht an ein Objekt. Das Objekt muss dann halt was mit anfangen können.
    Der Compiler kann natürlich schon zur Compilezeit gewisse Prüfungen durchführen, aber prizipiell geschiehts halt zur Laufzeit.

    Widersprecht mir, wenn ich was falsches erzähle. Mein (Halb-)Wissen kommt aus einer ganz rudimentären Erfahrung mit Smalltalk. 😉



  • obiger Link schrieb:

    Late Binding: Some object-oriented programming languages (notably C++) require a message receiver to be statically typed in source code, but don’t require the type to be exact. An object can be typed to its own class or to any class that it inherits from.The compiler therefore can’t tell whether the message receiver is an instance of the class specified in the type declaration, an instance of a subclass, or an instance of some more distantly derived class. Since it doesn’t know the exact class of the receiver, it can’t know which version of the method named in the message to invoke.In this circumstance, the choice is between treating the receiver as if it were an instance of the specified class and simply bind the method defined for that class to the message, or waiting until some later time to resolve the situation. **In C++, the decision is postponed to link time for methods (member functions) that are declared virtual.**This is sometimes referred to as “late binding” rather than “dynamic binding.” While “dynamic” in the sense that it happens at runtime, it carries with it strict compile-time type constraints. As discussed here (and implemented in Objective-C), “dynamic binding” is unconstrained.

    Der Linker stellt das also fest??? Und wozu ist dann die vtable da? Oder bin ich grad ganz schief gewickelt?
    Danke für die Aufklärung
    Jester



  • Das geht so: Du hast eine VTable (heißt hier isa), in der nicht nur Adressen der Methoden stehen, sondern auch deren Namen. Bei einem Aufruf wird nach dem Namen gesucht und die passende Adresse rausgesucht. Wird Sie in der eigenen Klasse nicht gefunden wird die isa der Basisklasse durchsucht, dann die deren Basisklasse, ... .

    also

    id foo = [[Klasse alloc] init];  // ist Cocoa, ich weiß
    
    [foo methode];
    

    Der Compiler hat keinerlei Ahnung, von welchem Typ foo ist. id kann jedes beliebige Objekt aufnehmen (nein es ist nicht - wie in Java - eine Basisklasse, von der jeder erbt; man erbt zwar allgemein von einer ähnlichen Klasse, Object oder bei Cocoa NSObject oder NSProxy, aber das ist theoretisch kein Zwang).



  • Oh und Elises vorschlag ist tatsächlich ein verdammt gutes Dokument zu dem Thema (meiner Meinung nach).


Anmelden zum Antworten