美文网首页
OC 向前声明

OC 向前声明

作者: crescent_star | 来源:发表于2016-03-09 15:58 被阅读974次

引用:http://m.oschina.net/blog/470405

一、向前引用 forward declaring

Objective-c 编写类 分别创建两个文件,头文件用.h,实现文件后缀用.m,代码示例如下:

== .h 文件
#import <Foundation/Foundation.h>
@interface Dog : NSObject    
@property (nonatomic, strong) NSString *name;
@end
== .m 实现文件
@implementation Dog
@end

查看Dog.h 文件,用Objective-C语言编写任何类几乎都需要引入Foundation.h,如果不引入这个文件的话,则需要引入预期超类所属框架相对应的"基本头文件"(base header file)。

现在创建个Person类,并引入Dog类

== .h 文件
#import <Foundation/Foundation.h>
#import “Dog.h" //引入Dog.h
@interface Person : NSObject
@property (nonatomic, strong) NSString *name;
@property (nonatomic, strong) Dog *dog;
@end
== .m文件
@implementation Person
@end

当系统编译Person.h 文件的时候,Dog 并不可见,必须引入Dog.h,常见方法为

#import "Dog.h"

由于在编译 Person 类的文件时,不需要知道Dog类的全部细节(Dog 类中的方法),若使用 #import "Dog.h" 则必须知道Dog.h的全部细节,而Person类中只需要知道类名Dog就可以了,可用通过以下方式告诉编译器@class Dog;这种方式叫向前声明 (forward declaring)

修改后的Person.h 文件如下

== .h 文件#import <Foundation/Foundation.h>
#class Dog; //引入Dog.h
@interface Person : NSObject    
@property (nonatomic, strong) NSString *name;    
@property (nonatomic, strong) Dog *dog;
@end
== .m 文件
// Person 的实现文件则需要引入Dog.h文件,需要知道Dog所有接口细节。
#import "Dog.h"  
@implementation Person
@end

向前引用,就是将引入头文件的时间尽量延后,只在确有需要时才引入,这样就可用减少类的使用者所需要引入的头文件数量。

二、向前声明解决的问题

向前声明解决了两个类互相引用的问题。
假如Dog 类中,需要添加Persion 属性,如果使用使用#import "Person.h"则会导致循环引用,当解析到Dog.h文件时,编译器会发现它引入Person.h头文件,编译器在引入Person.h头文件时,Person.h头文件反过头来引用Dog.h头文件,造成循环引用。

三、总结

向前声明可用降低编译时间,除非必要,则可以使用向前申明,并在实现文件中映入头文件,这样做可用尽量降低类之间的耦合。

相关文章

  • OC 向前声明

    引用:http://m.oschina.net/blog/470405 一、向前引用 forward declar...

  • 2 在类的头文件中尽量少引入其他头文件

    OC使用头文件(.h)和实现文件(.m)来区隔代码 @class 向前声明,将引入头文件的时机尽量延后,只在确有...

  • swift 调用 OC中的block

    OC中声明block; OC中实现block swift中实现

  • OC转Swift

    记录下OC转Swift的一些经历 文件区别 OC:.h声明 .m实现 Swift:.swift 声明+实现 参数...

  • UIControl扩大响应区域

    OC版本 声明 实现 Swift 版本

  • 第一章:熟悉OC

    1. ".h"文件中使用"向前声明"代替导入头文件 向前声明(forward declearing)eg: @cl...

  • 2018-04-01

    oc中对于类的属性声明和实现其getter和setter方法,oc 2.0中增加了属性声明,就是可以不用单独为每一...

  • 2018-04-01

    oc中对于类的属性声明和实现其getter和setter方法,oc 2.0中增加了属性声明,就是可以不用单独为每一...

  • OC中调用swift的代理

    swift中代理的声明: OC中的实现:

  • iOS-面试题2

    1、OC 能实现私有化吗?答:方法的私有化,声明即外漏,不声明不外漏。( .m 可以实现私有化。)2、OC 中有...

网友评论

      本文标题:OC 向前声明

      本文链接:https://www.haomeiwen.com/subject/aottlttx.html