Patrząc na to z nieco innym kątem ... trzeba zdecydować, czy chcesz, aby świat naprawdę wiemy o myClassB
będący własnością MyClassA
. Na przykład, jeśli chcesz tylko reklamować, że myString
, które można uzyskać przez MyClassA
. To izoluje inne klasy od poznania podstawowej implementacji myString
. Jeśli nie musisz ujawniać MyClassB
, ukryj to przed "resztą świata".
W tym przypadku byś zmienił MyClassA.h następująco:
//
// MyClassA.h
//
@interface MyClassA : NSObject
@property (strong, nonatomic, readonly) NSString *myString;
@end
W MyClassA.m, należy wykonać następujące czynności.
//
// 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
Należy pamiętać, że to, co robiłem tutaj jest użycie anonimowego kategorię wewnętrznie definiować właściwości dla myClassB
.
Kluczową sprawą jest to, czy ma sens, aby nie narażać innych osób na działanie MyClassB
. Główną zaletą tego podejścia jest to, że Twój kod jest bardziej plastyczny. Powiedzmy, że myString
otrzymuje inny sposób. Od zupełnie innej klasy lub innej metody. Kod, który musi zużywać myString
jest immunizowany.
Jeśli musisz wystawić , możesz użyć @class
zgodnie z zaleceniami Tylera powyżej lub #import MyClassB.h
z MyClassA.h. Najlepsze praktyki zalecają przekazanie deklaracji @class
. Ale czasami wygoda polegająca na tym, że nie trzeba pamiętać o zaimportowaniu wielu plików w pliku implementacyjnym, może wygrać. To twoja baza kodów, więc możesz wybrać, który z nich działa najlepiej dla Ciebie. Generalnie używam kombinacji tych dwóch.