2016-09-01 44 views
7

时,我有MyClassA其中有型MyClassB向前声明VS#进口继承

// 
// MyClassA.h 
// 

@interface MyClassA : NSObject 

@property (strong, nonatomic, readonly) MyClassB *myClassB; 

@end 

MyClassB有一个属性myString的属性。

// 
// MyClassB.h 
// 

@interface MyClassB : NSObject 

@property (copy, nonatomic, readonly) NSString *myString; 

@end 

我有MyClassC这需要访问myString在它的实现。

我应该 -

一)正向声明中MyClassA.hMyClassB#import "MyClassB.h"MyClassC.m

B)#import MyClassB.hMyClassA.h

回答

2

在一般情况下,你应该转发与申报@class尽可能在你的头文件中。你可能不希望这样做的唯一时候是从超类继承或声明协议一致性,因为编译器需要知道该类或协议中发生了什么。

对于这个实例,我将在您的头文件中使用@class属性声明,并在您的MyClassC.m文件中使用#import MyClassB.h。这将允许MyClassC知道MyClassB上的所有属性。

2

从一个稍微不同的角度来看待这个...你需要决定你是否希望世界真正知道myClassBMyClassA的财产。例如,如果您只想宣传可通过MyClassA获得的myString。这使得其他类不知道myString的底层实现。除非您需要暴露MyClassB,否则您应该将其隐藏在“其他地方”。

在这种情况下,你会改变MyClassA.h如下:

// 
// MyClassA.h 
// 

@interface MyClassA : NSObject 

@property (strong, nonatomic, readonly) NSString *myString; 

@end 

在MyClassA.m,你会做以下。

// 
// 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 

请注意,我在这里所做的是使用匿名类为myClassB内部定义属性。

这里的关键是不要将MyClassB暴露给其他人。这种方法的主要优点是你的代码更具延展性。假设myString得到不同的方式。完全不同的课程或不同的方法。需要消耗myString的代码被免疫。

如果您需要暴露MyClassB,则可以使用Tyler上面推荐的@class或使用MyClassA.h中的#import MyClassB.h。最佳做法规定提前宣布@class。但有时,不必记住在实现文件中导入大量文件的便利性可以胜出。这是你的代码库,所以你可以选择哪一个最适合你。我通常使用这两者的组合。