iOS一个.h/.m中定义多个类

在我们研究一些程序的代码时,总是能在某个.h文件中发现有许多@interface分别定义了不同的类。比如AFNetworking的AFURLRequestSerialization.h中我们可以看到:

@interface AFHTTPRequestSerializer : NSObject 
@interface AFJSONRequestSerializer : AFHTTPRequestSerializer
@interface AFPropertyListRequestSerializer : AFHTTPRequestSerializer

可能会有些疑惑。按照我们的想法来说,一个.h文件中写入一个@interface然后在.m中实现相关内容。事实上,这是因为我们在创建新的Cocoa Touch Class文件时,系统会根据我们新建时输入的Class名生成一套@interface/@implementation:
iOS一个.h/.m中定义多个类_第1张图片

//testClass.h
#import 

NS_ASSUME_NONNULL_BEGIN

@interface testClass : NSObject

@end

NS_ASSUME_NONNULL_END
//testClass.m
#import "testClass.h"

@implementation testClass

@end

久而久之就误以为一个(.h/.m)文件相当于一个类。其实,我们可以在一个(.h/.m)文件中写入多个类,这样在调用的时候只需要导入一个头文件即可生成该文件中所有定义过的类,并且文件中的类名可以和创建文件时的名字不同:

//testClass.h文件中  同时定义了两个类 可以发现没有类名和文件名相同

#import 
//========================
//@动物类
//========================
@interface animal : NSObject
@property(nonatomic,strong)NSString* animalName;
-(void)showAnimalaName;
@end
//========================
//@人物类
//========================
@interface person : NSObject
@property(nonatomic,strong)NSString* personName;
@end
//testClass.m文件中 

#import "testClass.h"

@interface animal()  //animal类的扩展
@end

@implementation animal  //animal类的实现
-(void)showAnimalaName{  
}
@end


@implementation person //person类的实现

@end

这样的情况下,我们在用到这两个类的时候可以直接在需要的地方导入:

#import "testClass.h"

然后可以直接使用了,不同类之间互不干扰:

    [[[animal alloc]init]showAnimalaName];
    [[person alloc]init].personName;

最后注意:
这样写的好处就是可以节省文件,导入一个文件即可把几个类一起引入,不同类之间无需导入即可互相引用。
但是这么做破坏了封装性,最好是在定义一些关系很紧密的类时使用,比如说数据类等。

你可能感兴趣的:(iOS)