Wenn Sie dies aus einem etwas anderen Blickwinkel betrachten ... müssen Sie sich entscheiden, ob Sie die Welt wirklich über myClassB
wissen möchten, die eine Eigenschaft von MyClassA
ist. Zum Beispiel, wenn Sie nur die myString
werben möchten, die durch MyClassA
erhalten werden kann. Dies isoliert andere Klassen davon, die zugrunde liegende Implementierung von myString
zu kennen. Sofern Sie keine Notwendigkeit haben, MyClassB
zu exponieren, sollten Sie es vor dem "Rest der Welt" verstecken.
In diesem Fall würde sich ändern Sie MyClassA.h wie folgt:
//
// MyClassA.h
//
@interface MyClassA : NSObject
@property (strong, nonatomic, readonly) NSString *myString;
@end
In MyClassA.m, würden Sie die folgende tun.
//
// MyClassA.m
//
#import "MyClassA.h"
#import "MyClassB.h"
@interface MyClassA()
@property (strong, nonatomic) MyClassB *myClassB;;
@end
@implementation MyClassA
// Other meaningful code omitted
- (NSString *)myString {
return self.myClassB.myString;
}
@end
Beachten Sie, dass hier getan, was ich habe, ist eine anonyme Kategorie verwenden, um intern Eigenschaft definieren für myClassB
.
Der Schlüssel hier ist, ob es sinnvoll ist, MyClassB
anderen nicht freizugeben. Der Hauptvorteil dieses Ansatzes ist, dass Ihr Code flexibler ist. Nehmen wir an, myString
wird auf andere Weise abgeleitet. Von einer anderen Klasse oder einer anderen Methode insgesamt. Der Code, der myString
verbrauchen muss, ist immunisiert.
Wenn Sie MyClassB
freilegen müssen, können Sie entweder @class
wie von Tyler empfohlen oder #import MyClassB.h
von MyClassA.h verwenden. Best Practices schreiben vor, @class
zu deklarieren. Aber manchmal kann der Komfort, sich nicht daran zu erinnern, viele Dateien in der Implementierungsdatei zu importieren, gewinnen. Es ist deine Code-Basis, also kannst du auswählen, welche am besten für dich funktioniert. Ich verwende normalerweise eine Kombination der beiden.