//
// Test.h
// app
//
// Created by you on 2021/10/29.
// Copyright © 2021 you. All rights reserved.
//
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
@interface LDTest : NSObject
@end
NS_ASSUME_NONNULL_END
创建一个继承自NSObject的类时候我们无法避免的会引入Foundation.h头文件,如果不在头文件引入这个文件的话,那么就要引入其
超类/根类所属框架的Basic Header File。
但通常我们无法避免引入头文件,因为我们需要把某个类方法暴露出来或者是使用单例,那么.h文件会变成这样
//
// Test.h
// app
//
// Created by you on 2021/10/29.
// Copyright © 2021 you. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "Manager.h"
NS_ASSUME_NONNULL_BEGIN
@interface LDTest : NSObject
@property (nonatomic, strong) Manager *manager;
@end
NS_ASSUME_NONNULL_END
这么做虽然可以,但是不够优雅,因为通常来说我只需要用到单例里的某个方法或类里的某个方法,在.h头文件中引入会把该单例或类的头文件一并引入,然鹅我们并不需要用到。
当我们使用一个类文件时候,并不需要知道所引用的头文件里面的所有细节,此时用向前声明 @class 来告诉编译器有一个类我需要用到就好,那么此时头文件会变成
//
// Test.h
// app
//
// Created by you on 2021/10/29.
// Copyright © 2021 you. All rights reserved.
//
#import <Foundation/Foundation.h>
@class Manager;
NS_ASSUME_NONNULL_BEGIN
@interface Test : NSObject
@property (nonatomic, strong) Manager *manager;
@end
NS_ASSUME_NONNULL_END
则在Test类的实现文件里则需要引入Manager.h 因为需要使用到该类必须知道其接口的所有细节。
//
// Test.m
// app
//
// Created by you on 2021/10/29.
// Copyright © 2021 you. All rights reserved.
//
#import "LDTest.h"
#import "Manager.h"
@implementation Test
@end
将引入头文件的时机尽量延后,只在确有需要的时候引入,这样可以减少类使用者所需要引入头文件的数量。
除非有明确的必要,否则不要引入头文件。一般来说,应该在某个类的头文件使用向前声明来提及别的类,并在实现文件中引入哪些类的头文件。这么做可以尽量降低类之间的耦合
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。