2010-10-15 7 views
16

Was ist der Unterschied zwischen einer privaten Methode und einer privaten Schnittstelle? Zum Beispiel weiß ich, dass wenn Sie eine Methode in einer Implementierung definieren und seine Schnittstelle es nicht erwähnt, wird es als eine private Methode betrachtet. Ich habe auch Dinge wie gesehen:Private Schnittstelle vs. private Methode - Ziel c

@interface Collector() 
@property (readonly) NSMutableDictionary *count; 
@end 

Innerhalb der .m-Implementierungsdatei.

Antwort

20

@interface Foo() erstellt eine Klassenerweiterung (ich stehe korrigiert, Requisiten zu Bbum) auf der Schnittstelle Foo, die wie zusätzliche Methoden der Schnittstelle hinzugefügt wird. Einige Leute verwenden auch @interafce Foo(Private) (Kategorie) anstelle einer Klassenerweiterung mit (). Es ist eher so, als würden neue Methoden außerhalb einer Klasse in eine Klasse "injiziert".

Wenn Sie dies in die .m-Datei einfügen, werden andere Dinge nicht in der .h-Datei angezeigt, aber das war's. Grundsätzlich verwenden Personen normalerweise Kategorien oder Klassenerweiterungen in .m-Dateien, um private Schnittstellen anzugeben, aber sie werden auch für Dinge wie UIKit verwendet, die Kategorien verwenden, um row und section öffentliche Methoden zu NSIndexPath hinzuzufügen. (Dies kann verwirrend sein.) Sie müssen nicht wirklich private Methoden auf diese Weise definieren, aber wenn Sie eine Methode namens bar haben, die die Methode foo aufruft, bevor foo in der Quelldatei definiert ist, erhalten Sie einen Compiler Warnung etwas wie "Objekt selbst kann nicht auf foo reagieren". Sie können das entfernen, indem Sie foo definieren, bevor Sie Bar oder einen anderen foo-calling-Code definieren. Das Gleiche gilt für normale C und Funktionen. Wie Ole sagt, dass dies niemanden daran hindert, die privaten Methoden aufzurufen, erklärt es nur Ihre Absicht, dass sie privat sind und bewirkt, dass der Compiler die "Kann nicht auf" Warnungen generiert, selbst wenn sie die .h-Datei importieren .

EDIT

Siehe auch http://www.friday.com/bbum/2009/09/11/class-extensions-explained/ für eine Erklärung der Kategorien vs. Klassenerweiterungen. Klassenerweiterungen sollten für die Definition privater Methoden aus Sicht des Compilerwarns korrekter sein, da Kategoriemethoden optional sind. Wünschte, mein Buch hätte das erklärt!

+8

Es gibt einen großen Unterschied zwischen benannten Kategorien '(foo)' und einer Klassenerweiterung '()'. – bbum

+0

Haben Sie einen Hinweis darauf? Ich sehe in dem Buch "Programmieren in Objective-C 2.0" nichts darüber. Es scheint, als wäre der Kategoriename nur optional von allem, was ich sagen kann. Nicht, dass ich ein großer Experte wäre oder irgendetwas anderes, aber es wäre hilfreich, wenn Sie einen Link bereitstellen könnten, der den Unterschied zwischen (Privat) und() erklärt. – Nimrod

+0

vergesst, ich scheine deinen Blog gefunden zu haben http://www.friday.com/bbum/2009/09/11/class-extensions-explained/ Ich frage mich, warum mein Buch nicht darüber spricht? – Nimrod

17

Objective-C hat keine völlig privaten Methoden. Die in einem privaten Schnittstellenabschnitt in der M-Datei deklarierte Methode ist unsichtbar zu externen Anrufern, aber es ist nicht privat. Kennt jemand die Methodensignatur und ignoriert die Compiler-Warnung, kann er diese von außen ohne Probleme aufrufen.