363 Stimmen

Der beste Weg, private Methoden für eine Klasse in Objective-C zu definieren

Ich habe gerade mit der Programmierung von Objective-C begonnen und frage mich, da ich einen Hintergrund in Java habe, wie Leute, die Objective-C-Programme schreiben, mit privaten Methoden umgehen.

Ich verstehe, dass es verschiedene Konventionen und Gewohnheiten geben kann, und betrachte diese Frage als einen Aggregator der besten Techniken, die Menschen im Umgang mit privaten Methoden in Objective-C verwenden.

Bitte geben Sie bei der Veröffentlichung eine Begründung für Ihren Ansatz an. Warum ist er gut? Welche Nachteile hat er (die Ihnen bekannt sind) und wie gehen Sie damit um?


Was meine bisherigen Erkenntnisse betrifft.

Es ist möglich, Folgendes zu verwenden Kategorien [z. B. MyClass (Private)] in der Datei MyClass.m definiert, um private Methoden zu gruppieren.

Dieser Ansatz hat 2 Probleme:

  1. Xcode (und Compiler?) prüft nicht, ob Sie alle Methoden in der Kategorie private im entsprechenden @implementation-Block definieren
  2. Sie müssen @interface, das Ihre private Kategorie deklariert, an den Anfang der Datei MyClass.m setzen, sonst beschwert sich Xcode mit einer Meldung wie "self may not respond to message "privateFoo".

Das erste Problem kann durch folgende Maßnahmen gelöst werden leere Kategorie [z.B. MyClass ()].
Der zweite Punkt stört mich sehr. Ich würde gerne private Methoden am Ende der Datei implementiert (und definiert) sehen; ich weiß nicht, ob das möglich ist.

3voto

Zack Sheppard Punkte 1

Jedes Objekt in Objective C entspricht dem NSObject-Protokoll, das die performSelector: Methode. Ich habe auch nach einer Möglichkeit gesucht, einige "Hilfs- oder private" Methoden zu erstellen, die nicht öffentlich zugänglich sein müssen. Wenn Sie eine private Methode ohne Overhead und ohne sie in Ihrer Header-Datei definieren zu müssen, erstellen möchten, sollten Sie dies ausprobieren...

Definieren Sie Ihre Methode mit einer ähnlichen Signatur wie im folgenden Code...

-(void)myHelperMethod: (id) sender{
     // code here...
}

Wenn Sie dann auf die Methode verweisen müssen, rufen Sie sie einfach als Selektor auf...

[self performSelector:@selector(myHelperMethod:)];

wird diese Codezeile die von Ihnen erstellte Methode aufrufen und keine lästige Warnung darüber ausgeben, dass sie nicht in der Header-Datei definiert ist.

3voto

FellowMD Punkte 1932

Sie könnten Blöcke verwenden?

@implementation MyClass

id (^createTheObject)() = ^(){ return [[NSObject alloc] init];};

NSInteger (^addEm)(NSInteger, NSInteger) =
^(NSInteger a, NSInteger b)
{
    return a + b;
};

//public methods, etc.

- (NSObject) thePublicOne
{
    return createTheObject();
}

@end

Ich bin mir bewusst, dass dies eine alte Frage ist, aber es ist eine der ersten, die ich gefunden habe, als ich nach einer Antwort auf genau diese Frage suchte. Ich habe diese Lösung nirgendwo anders diskutiert gesehen, also lassen Sie mich wissen, ob es etwas dumm ist, dies zu tun.

2voto

rebelzach Punkte 2640

Wenn Sie die @interface Block am Anfang können Sie die privaten Deklarationen immer in eine andere Datei einfügen MyClassPrivate.h nicht ideal, aber es bringt die Umsetzung nicht durcheinander.

MyClass.h

interface MyClass : NSObject {
 @private
  BOOL publicIvar_;
  BOOL privateIvar_;
}

@property (nonatomic, assign) BOOL publicIvar;
//any other public methods. etc
@end

MyClassPrivate.h

@interface MyClass ()

@property (nonatomic, assign) BOOL privateIvar;
//any other private methods etc.
@end

MyClass.m

#import "MyClass.h"
#import "MyClassPrivate.h"
@implementation MyClass

@synthesize privateIvar = privateIvar_;
@synthesize publicIvar = publicIvar_;

@end

2voto

Rich Schonthal Punkte 472

Eine weitere Sache, die ich nicht gesehen habe hier erwähnt - Xcode unterstützt .h-Dateien mit "_private" im Namen. Nehmen wir an, Sie haben eine Klasse MyClass - Sie haben MyClass.m und MyClass.h und jetzt können Sie auch MyClass_private.h. Xcode wird dies erkennen und es in die Liste der "Gegenstücke" im Assistenten-Editor aufnehmen.

//MyClass.m
#import "MyClass.h"
#import "MyClass_private.h"

1voto

Barry Wark Punkte 106328

Es gibt keine Möglichkeit, Problem Nr. 2 zu umgehen. Das ist einfach die Art und Weise, wie der C-Compiler (und damit der Objective-C-Compiler) arbeiten. Wenn Sie den XCode-Editor verwenden, sollte das Funktions-Popup es einfach machen, in der @interface y @implementation Blöcke in der Datei.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X